5

Springを使用してマネージドBeanをjsfに提供しようとしています。スプリングの使用法をfaces-config.xmlで構成することにより、スプリングを使用している場合でも、@ ManagedBeanがJSFコンテナーによって取得され、JSFのELをマネージドBeanにリンクすると想定します。

春は豆を提供しますが、豆の範囲を管理するのは誰ですか?

Beanのアノテーションに従って、リクエストスコープにしようとしましたが、機能しません。

@ManagedBean(name="helloBean") //meant for JSF
@RequestScoped //meant for JSF
@Scope(value="request") //meant for spring
@Controller //meant for spring
public class HelloBean implements Serializable {

実際、以前はプレーンJSFを使用していましたが、@ManagedBeanと@RequestScopedはうまく機能していました。スプリングを使用して統合しようとしたため、スコープが機能していません。

spring configでBeanスコープを設定しようとしましたが、Springのコンテキスト(シングルトンとプロトタイプ)では期待どおりに機能しますが、Webリクエストのコンテキストでは機能しません。

JSFがスコープを管理することを期待して、上記の@Scopeおよび@Controllerアノテーションを使用する必要がないようにしようとしていましたが、そうではないようです。

以下は、Spring configとMyHelloBeanのファイルスニペットで、おそらくコミュニケーションを改善するのに役立ちます。

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" />

<bean id="myHelloBean" class="com.mkyong.common.MyHelloBean" init-method="init" >
        <property name="helloBean" ref="helloBean"></property>
</bean>

@ManagedBean
@RequestScoped
@Scope(value="request")
@Controller
public class MyHelloBean implements Serializable {

    private static final long serialVersionUID = 1L;
    //@ManagedProperty(value = "#{helloBean}")
    private HelloBean helloBean;

上記のMyHelloBeanを参照してください。私はSpringDIを使用して、SpringFineによって設定されるhelloBeanを設定しています。@ManagedBeanをコメントアウトしましたが、春には無視され、JSFは処理しないので、そのままにしておくことができますが、安全のために、JSFが処理しないようにコメントアウトしました。

完了するには、以下のfaces-configを使用して、春の使用法をアクティブにします。

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

よろしく、

みてん。

4

2 に答える 2

5

私たちのチームは、スコープの問題など、JSFとSpringBeanの統合に関する同様の問題に直面しました。そして、ここで私は私たちの知識を共有することになっています。

スコープ

基本的に、アプリケーションコンテキストで定義すると、そのSpringがBean、つまりスコープを管理するようになります。Springは、JSFスコープアノテーションをネイティブスコープアノテーションにマップします。

  • SpringとJSFの両方のサポートがスコープを提供した場合の例:

@RequestScopedアノテーションは、サポートされている他のスコープを使用して、@ Scope( "request")Springのアノテーションなどにマップされます。

  • SpringがJSFが提供するスコープをサポートしていない場合の例:

@ViewScopedは、Springのネイティブスコープアノテーションで定義されていないため、(不明)Springのデフォルトスコープであるシングルトンまたはリクエストスコープ(不明)を使用します。

豆の注射

JSF2では、インジェクションに@ManagedPropertyアノテーションを使用しましたが、Springは@Autowiredアノテーションを使用します。違いは何ですか?どちらを選択しますか?

  • @ManagedPropertyを使用したSpringBeanの注入:

注入するSpringコンポーネントは、jsf注入アノテーションの値と一致する値を持っている必要があります:@ManagedProperty(value = "valueMatches")で注入された@Component(value = "valueMatches")。

  • @Autowiredを使用したSpringBeanの注入:

注入するSpringコンポーネントは、注入するBeanの唯一の実装である場合、区別するためのカスタム値を必要としない必要があります。@Componentは@Autowiredで注入されます。

我々の方法

Bean、スコープ、インジェクションを定義するためにSpringのアノテーションを使用しました。

JSF Beanに、@ Scope(value = "desiredScope")、@ Controller(value = "beanName")、および@Qualifier(value = "beanName")アノテーションを付けました。後で、@Controllerアノテーションで定義された「beanName」値を介してfaces-config.xmlを使用してJSFコンテキストからアクセスできます。

Springサービスに@Serviceアノテーションを付けました。

SpringサービスとJSFBeanに@Autowiredアノテーションを注入しました。

Web上でViewScopeとFlashScopeのカスタム実装を見つけ、それらをBeanに使用しました。したがって、JSF2スコープを失うことはなく、新しいスコープを追加することもできました。

お役に立てれば。

于 2012-05-31T08:52:00.557 に答える
2

SpringXML構成とSpringAnnotationベースの構成を混合しているように見えるという意味で、あなたのアプローチは少し混乱しています。ここで例として説明されているように、注釈付きの構成を使用している場合は、次のものが必要です。

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

注釈のSpringスキャンを注文します。それ以外の場合、XML構成を使用している場合は、次のものが必要です。

<bean id="helloBean" class="com.mkyong.common.HelloBean" init-method="init" scope="request" />

デフォルトではscope、SpringBeanのはsingletonです。

于 2012-05-31T07:48:57.407 に答える