web-dev-qa-db-ja.com

JSF 2は、@ ManagedPropertyを使用し、xmlを使用せずにSpring Bean / Serviceを注入します

JsfアノテーションといくつかのSpringアノテーションを使用して、Spring Bean/ServiceをjsFマネージドBeanに注入したいと思います。 (jsf Beanではjsfアノテーションのみを使用したい)@named/@injectのようなアノテーションは使用したくない。

私はネット上で解決策を見つけようとしましたが、運がありませんでした。

@ManagedBean
@ViewScoped 
public class MyBean {

    @ManagedProperty(value = "#{mySpringBean}")
    private MySpringBean mySpringBean;

    public void setMySpringBean(MySpringBean mySpringBean) {
        this.mySpringBean = mySpringBean;
    }

    public void doSomething() {
    //do something with mySpringBean
    }
}

Xmlを使用せずにこのようなことが可能ですか。たとえば、私は次のようなものを使用したくない

FacesContextUtils.getWebApplicationContext(context).getBean("MySpringBean");

またはfaces-config.xml

<managed-bean>
    <managed-bean-name>myBean</managed-bean-name>
    <managed-bean-class>com.mytest.MyBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
    <managed-property>
        <property-name>mySpringBean</property-name>
        <value>#{mySpringBean}</value>
    </managed-property>
</managed-bean>

上記のようなことは、アノテーションを使用して、configxmlファイル内のすべてのBeanのすべてのjsfBean/propertiesとSpringBean/Propertiesを定義せずに可能ですか?

15
Dimman

すでにSpringコンテナをお持ちの場合は、@ Autowiredアノテーションを使用してみませんか。そのためには、Boniの提案に従ってfaces-config.xmlを更新します。次に、これらのリスナーをこの後にweb.xmlに追加します

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

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

<listener>
  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

次に、これらをapplicationContext.xmlに追加します

<context:component-scan base-package="com.examples" />

これで、Springアノテーションを使用でき、Beanは次のようになります。

package com.examples;
@Component
@Scope(value="request")
public class MyBean {
    @Autowired
    private MySpringBeanClass mySpringBean;
}

MySpringBeanClassに@Serviceアノテーションを付けます

関連項目:

14
Ravi

このコードをfaces-config.xmlに入れてください

<faces-config xmlns="http://Java.Sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee 
    http://Java.Sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
</faces-config>

次に、ManageBeanコンストラクター呼び出しで;

WebApplicationContext ctx =  FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
mySpringBean = ctx.getBean(MySpringBean.class);

MySpringBeanは、SpringBeanクラスを意味します

11
Boni

Web.xmlおよびapplicationContext.xmlでSpringを適切に構成したと仮定します。 faces-config.xmlに次のエントリを作成します

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

上記のサンプルコードは問題ないようです。上記のエントリで発生するのは、管理プロパティが最初にJSFによって管理されているBeanで検索され、見つからない場合はSpringによって管理されているBeanで検索されることです。 Spring Beanには適切なアノテーションがマークされている必要があり、@ ManagedPropertyで指定された名前は、Beanに指定されたデフォルト/名前と一致する必要があります。

必須ではない@Boniが述べたように、自動注入されます。私はあなたが望むように設定を使用しました。

補足:ビュースコープを選択しているので、このリンクをご覧ください @ ViewScopedの利点と落とし穴

3
baba.kabira