我有一个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成为单身?这件事的正确方法是什么?
答案 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;
}
}
可能有比这更好的方法,但这是我最近一直在使用的方法。