3

JSF 管理のセッション スコープ Bean があります。これはスプリング コンポーネントでもあるため、いくつかのフィールドを挿入できます。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.springframework.stereotype.Component;

@ManagedBean
@SessionScoped
@Component
public class EpgBean {...}

問題は、セッションがユーザー間で共有されていることです! ユーザーが何らかの操作を行い、別のコンピューターの別のユーザーが接続すると、そのユーザーの SessionScoped データが表示されます。

Bean を強制的にシングルトンにするスプリング @Component が原因ですか? この問題に対する正しいアプローチは何ですか?

4

2 に答える 2

6

@Scope("session"JSF の代わりにspring scope アノテーションを使用して問題を解決しました@SessionScopped。Spring は FacesEl リゾルバーとして構成されているため、重要なのは Spring スコープであり、JSF スコープは無視されると思います。

于 2012-07-06T12:18:11.050 に答える
2

私が使用するアプローチは、マネージド Bean を JSF コンテナー内に保持し、マネージド プロパティの EL を介して Spring Bean をコンテナーに注入することです。関連する質問を参照してください。

そのためには、 SpringBeanFacesELResolverをにセットアップしてfaces-config.xml、JSF EL が Spring Bean を解決できるようにします。

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

その後、次のように @ManagedBean アノテーション付き Bean に Spring Bean を注入できます。

@ManagedBean
@ViewScoped
public class SomeMB {
    // this will inject Spring bean with id someSpringService
    @ManagedProperty("#{someSpringService}")
    private SomeSpringService someSpringService;

    // getter and setter for managed-property
    public void setSomeSpringService(SomeSpringService s){
        this.someSpringService = s;
    }
    public SomeSpringService getSomeSpringService(){
        return this.someSpringService;
    }
}

これよりも優れたアプローチがあるかもしれませんが、これは私が最近使用しているものです。

于 2012-07-06T11:51:39.290 に答える