JSF/Spring会话在用户之间共享

JSF/Spring会话在用户之间共享,spring,session,jsf,Spring,Session,Jsf,我有一个JSF管理的会话范围bean。它也是一个spring组件,因此我可以注入一些字段: import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import org.springframework.stereotype.Component; @ManagedBean @SessionScoped @Component public class EpgBean {...} 问题是会话是在用户之间

我有一个JSF管理的会话范围bean。它也是一个spring组件,因此我可以注入一些字段:

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

@ManagedBean
@SessionScoped
@Component
public class EpgBean {...}
问题是会话是在用户之间共享的!如果一个用户做了一些事情,另一个用户从另一台计算机连接,他会看到另一个用户的会话处理数据


这是由于spring@组件迫使bean成为单例的原因吗?解决这个问题的正确方法是什么?

我使用的方法是将托管bean保存在JSF容器中,并通过托管属性上的EL将Spring bean注入其中。看

为此,请在
faces config.xml
中进行设置,以便JSF EL能够解析Springbeans:

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

可能还有比这更好的方法,但这就是我最近一直在使用的方法。

我使用spring范围注释
@scope(“session”
)而不是JSF
@SessionScopped
解决了这个问题。我想,由于spring被配置为FacesEl解析器,所以重要的是spring作用域,而JSF作用域被忽略。

我不使用spring,但理论上应该去掉那些未使用的JSF托管bean注释(因为这只会让您感到困惑;如果您使用另一个框架来管理bean,则根本不会使用它们)并添加一个特定于Spring的范围注释,类似于
@scope(“session”)
等等(它确实默认为“application”范围,就像没有声明JSF特定的范围注释时JSF默认为“none”范围)。谢谢,我没有考虑使用ManagedProperty。然而,我相信我最初的方法(声明为spring组件)更好,因为您不必通过EL显式地编写注入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;
    }
}