ELLO
我有2个托管bean,一个是作用域,另一个是作用域。 View作用域bean定义为
@ManagedBean
@ViewScoped
public class InvoiceController implements Serializable {
private static final long serialVersionUID = 1L;
@ManagedProperty(value="#{invoiceService}")
private InvoiceService invoiceService;
会话范围bean为
@ManagedBean
@SessionScoped
public class InvoiceService implements Serializable{
我正在使用会话范围的bean来保存一个标志,用于决定是否应该呈现一个面板,当我通过调试运行时,我发现每次在sesison bean上调用该方法时,它都是一个新的实例的bean,因此不会在请求之间保留我的标志值。
我做错了什么?
答案 0 :(得分:7)
如果您从javax.enterprise.context
包而不是javax.faces.bean
包中导入@SessionScoped
,就会发生这种情况。前者仅适用于CDI @Named
bean,而后者仅适用于JSF @ManagedBean
bean。
没有任何有效范围的JSF @ManagedBean
将默认为@NoneScoped
,这意味着它是在引用该bean的每个EL表达式上新构建的,例如@ManagedProperty
。这解释了您所看到的症状。
答案 1 :(得分:0)
我有类似的问题。我在视图范围bean中使用了一个save方法,它调用会话范围bean中的方法来更新某些值。
这是我通过调试找到的(请原谅我的非Java-guru英语):
首次加载页面时,注入的会话bean的实例编号为例如111111。 但是在save-method(以及像commandButton或动作监听器btw这样的动作调用的所有其他方法)中,会话bean突然变成另一个实例(比如222222)。
实例111111和222222都包含非常相同的值。 我现在调用的所有方法都是在222222实例中完成的,它根据需要在那里更改了值。但是111111的情况仍然没有改变。
所以222222基本上是111111的深(?)克隆,甚至不是副本。
但是,在完成save-method并重新加载页面之后,在视图范围bean中再次使用了原始的111111实例。 222222实例刚被扔进垃圾箱。
我解决此问题的方法:
我不再使用ManagedProperty注射了。
相反,我做了一些帮助代码来获取会话bean,无论我需要它(也就是在视图范围内的bean方法中):
public Object getSessionBean(String sessionBeanName)
{
return FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, sessionBeanName);
}
对于上面的示例,调用将是:
InvoiceService invoiceService =(InvoiceService)helper.getSessionBean(“invoiceService”);
在您的方法中调用它,不要将其存储为视图范围bean中的字段。
我希望这能帮助您解决问题。