用户之间共享JSF / Spring Session

时间:2012-07-06 10:00:02

标签: spring session jsf

我有一个JSF管理的会话scopped 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成为单身?这件事的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

我使用spring scope annotation @Scope("session")而不是JSF @SessionScopped解决了这个问题。我想因为spring被配置为FacesEl解析器,所以弹簧范围很重要,而忽略了JSF范围。

答案 1 :(得分:2)

我使用的方法是将托管bean保留在JSF容器中,并通过托管属性上的EL将Spring bean注入其中。请参阅related question

为此,在faces-config.xml中设置SpringBeanFacesELResolver,以便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;
    }
}

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