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 数据。

是因为弹簧 @Component 会迫使 bean 成为单例吗?解决这个问题的正确方法是什么?

4

2 回答 2

6

@Scope("session"我使用 spring 范围注释)而不是 JSF解决了这个问题@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 回答