3

プロパティを持つ@RequestScopedBeanがありListます。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.springframework.stereotype.Controller;

@Controller
@ManagedBean
@RequestScoped
public class MyBean implements Serializable {

    private List list;

    // getters and setters
}

このプロパティはデータテーブルにリンクされています:

<ice:dataTable value="#{myBean.list}" ..other stuff.. />

リストは問題なく動的に入力され、データテーブルは問題なく表示されます。しかし、別のページに移動して最初のページに戻ると、データテーブルには最初のリクエストのデータが残っています。それは再び空であるべきではありませんか?Bean がリクエストスコープの場合、リクエスト後に破棄する必要があり、最初にデータテーブルを取得して空にする必要があります。

さらに奇妙なのは、あるブラウザー (Firefox など) でページを開いてデータテーブルにリクエストを入力し、別のブラウザー (Chrome など) を開いてデータテーブル ページに移動すると、前のリクエストのデータで満たされることです。別のブラウザから!Bean はアプリケーションのように動作していると思います。

何か案は?


更新 1 : クラスは静的でも変数でもありません。また、Tomcat キャッシュを無効にしましたが、まだ機能していません。

更新 2 : おそらく問題が見つかったと思います。@Controller私のバッキング Bean には、Springの注釈が付けられています。@Autowiredサービスをバインドするために使用するため、この注釈を使用します。これはシングルトンを作成している可能性があり、リクエストごとに作成および破棄されないのはなぜですか? Spring と JSF2 のアノテーションが混在していることに問題があることは確かだと思います。

4

1 に答える 1

4

JSF、CDI、Spring などの複数の異なる Bean 管理フレームワークで単一の Bean を管理しないでください。どちらかを選択してください。Spring などで Bean を管理する場合、JSFや CDI@Controllerなどの他のフレームワークの Bean 管理関連のアノテーションはすべて無視されます。@ManagedBean@Named

私はSpringをやっておらず、標準のJava EE 6 APIの代わりにSpringを使用している理由もわかりませんが、症状とドキュメントは、そのようなSpring Beanのスコープが実際にアプリケーションスコープにデフォルト設定されていることを示しています. @ScopeSpringアノテーションで bean スコープを指定する必要があります。また、JSF Bean 管理アノテーションはもはや価値がなく、開発者/メンテナーを混乱させるだけなので削除したいと考えています。

@Controller
@Scope("request")
public class MyBean implements Serializable {
    // ...
}

@Controllerまたは、Springアノテーションを削除して JSF に固執することもできます@ManagedBean@ManagedProperty代わりに、@Autowired別の@ManagedBeanインスタンスまたは Spring マネージド Bean (Spring Faces EL リゾルバーが構成されている場合) を注入するか、Java EE 標準を使用してまたはインスタンス@EJBを注入できます。@Stateless@Stateful

例えば

@ManagedBean
@RequestScoped
public class MyBean implements Serializable {

    @EJB
    private SomeService service;

    // ...
}

以下も参照してください。

于 2012-05-07T18:52:12.413 に答える