1概要

この記事では、ビジネスロジックの実行をSpring Beanに委任することを目的として、JSFマネージドBeanおよびJSFページ内からSpringで定義されたBeanにアクセスするためのレシピを紹介します。

この記事は、読者がJSFとSpringの両方について別々に理解していることを前提としています。この記事は、JSFのhttps://javaserverfaces.java.net/[Mojarraの実装]に基づいています。


2春に

次のBeanをSpringで定義しましょう。

UserManagementDAO

Beanは、メモリ内ストアにユーザー名を追加します。これは、次のインターフェースによって定義されます。

public interface UserManagementDAO {
    boolean createUser(String newUserData);
}

Beanの実装は、次のJava設定を使用して設定されます。

public class SpringCoreConfig {
    @Bean
    public UserManagementDAO userManagementDAO() {
        return new UserManagementDAOImpl();
    }
}

または、次のXML設定を使用してください。

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
<bean class="com.baeldung.dao.UserManagementDAOImpl" id="userManagementDAO"/>

BeanをXMLで定義し、

CommonAnnotationBeanPostProcessor

を登録して、

@ PostConstruct

アノテーションが確実に取得されるようにします。


3構成

次のセクションでは、SpringコンテキストとJSFコンテキストの統合を可能にする設定項目について説明します。


3.1.

web.xml


を使用しないJava構成


WebApplicationInitializer

を実装することで、__ServletContextをプログラム的に構成することができます。

public void onStartup(ServletContext sc) throws ServletException {
    AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
    root.register(SpringCoreConfig.class);
    sc.addListener(new ContextLoaderListener(root));
}


AnnotationConfigWebApplicationContext

はSpringのコンテキストをブートストラップし、

SpringCoreConfig

クラスを登録することでBeanを追加します。

同様に、Mojarra実装には、

FacesServletを設定する

FacesInitializer

クラスがあります。この設定を使用するには、

FacesInitializerを拡張するだけで十分です。

public class MainWebAppInitializer extends FacesInitializer implements WebApplicationInitializer {
    public void onStartup(ServletContext sc) throws ServletException {
        AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.register(SpringCoreConfig.class);
        sc.addListener(new ContextLoaderListener(root));
    }
}


3.2.

web.xml


を使う

アプリケーションの

web.xml

ファイルで

ContextLoaderListener

を構成することから始めます。

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

このリスナーは、Webアプリケーションの起動時にSpringアプリケーションコンテキストを起動します。このリスナーはデフォルトで

applicationContext.xml

という名前のSpring設定ファイルを探します。


3.3.

faces-config.xml



face-config.xml

ファイルで

SpringBeanFacesELResolver

を構成します。

<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

ELリゾルバはJSFフレームワークでサポートされているプラ​​グイン可能なコンポーネントで、式言語(EL)式を評価するときにJSFランタイムの動作をカスタマイズすることができます。このELリゾルバは、JSFランタイムがJSFで定義されたEL式を介してSpringコンポーネントにアクセスすることを可能にします。


4 JSF

でSpring Beansにアクセスする

この時点で、私たちのJSF Webアプリケーションは、JSFバッキングBeanまたはJSFページからSpring Beanにアクセスする準備ができています。


4.1. バッキングBeanからJSF 2.0

Spring BeanはJSFバッキングBeanからアクセスできるようになりました。実行しているJSFのバージョンに応じて、2つの方法が考えられます。

JSF 2.0では、JSFマネージドBeanで

@ ManagedProperty

アノテーションを使用します。

@ManagedBean(name = "registration")
@RequestScoped
public class RegistrationBean implements Serializable {
    @ManagedProperty(value = "#{userManagementDAO}")
    transient private IUserManagementDAO theUserDao;

    private String userName;

   //getters and setters
}


@ManagedPropertyを使用する場合、getterとsetterは必須です。Now – マネージドBeanからSpring Beanへのアクセス可能性をアサートするために、

createNewUser()__メソッドを追加します。

public void createNewUser() {
    FacesContext context = FacesContext.getCurrentInstance();
    boolean operationStatus = userDao.createUser(userName);
    context.isValidationFailed();
    if (operationStatus) {
        operationMessage = "User " + userName + " created";
    }
}

このメソッドの要旨は、

userDao

Spring Beanを使用してその機能にアクセスすることです。

** 4.2. JSF 2.2のバッキングBeanから

JSF 2.2以降でのみ有効なもう1つのアプローチは、CDIの

@ Inject

アノテーションを使用することです。これは、JSF管理対象Bean(

@ ManagedBean

アノテーション付き)とCDI管理対象Bean(

@ Named

アノテーション付き)に適用されます。

実際、CDIアノテーションを使用すると、これがBeanを注入するための唯一の有効な方法になります。

@Named( "registration")
@RequestScoped
public class RegistrationBean implements Serializable {
    @Inject
    UserManagementDAO theUserDao;
}

この方法では、ゲッターとセッターは必要ありません。 EL表現がないことにも注意してください。


4.3. JSFビューから


createNewUser()

メソッドは、次のJSFページからトリガされます。

<h:form>
    <h:panelGrid id="theGrid" columns="3">
        <h:outputText value="Username"/>
        <h:inputText id="firstName" binding="#{userName}" required="true"
          requiredMessage="#{msg['message.valueRequired']}" value="#{registration.userName}"/>
        <h:message for="firstName" style="color:red;"/>
        <h:commandButton value="#{msg['label.saveButton']}" action="#{registration.createNewUser}"
          process="@this"/>
        <h:outputText value="#{registration.operationMessage}" style="color:green;"/>
    </h:panelGrid>
</h:form>

ページをレンダリングするには、サーバーを起動して次の場所に移動します。

http://localhost:8080/jsf/index.jsf

Spring Beanにアクセスするために、JSFビューでELを使用することもできます。それをテストするには、前に紹介したJSFページの7行目を次のように変更すれば十分です。

<h:commandButton value="Save"
  action="#{registration.userDao.createUser(userName.value)}"/>

ここでは、Spring DAO上で直接

createUser

メソッドを呼び出し、JSFページ内から

userName

のバインド値をメソッドに渡して、マネージドBeanを回避します。


5結論

SpringコンテキストとJSFコンテキストの基本的な統合について検討しました。ここでは、JSF Beanおよびページ内でSpring Beanにアクセスできます。

注目すべきは、JSFランタイムはSpringフレームワークが統合コンポーネントを提供することを可能にするプラガブルアーキテクチャを提供しますが、SpringフレームワークからのアノテーションはJSFコンテキストでは使用できず、その逆も同様です。

つまり、

@ Autowired



@ Component

などのアノテーションをJSFマネージドBeanで使用したり、SpringマネージドBeanで

@ ManagedBean

アノテーションを使用することはできません。ただし、JSF 2.2以降のマネージドBeanとSpring Beanの両方で

@ Inject

アノテーションを使用できます(SpringはJSR-330をサポートしているため)。

この記事に付随するソースコードはhttps://github.com/eugenp/tutorials/tree/master/jsf[GitHub]にあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です