我不能使用@ManagedProperty 访问会话范围变量吗?
Can't I access session scope variable using @ManagedProperty?
我知道我可以 put/get 像这样的会话范围变量。
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put(SESSION_KEY_SOME, some);
那我不能这样访问值吗?
@ManagedBean
@SessionScoped
public class SomeOtherBean {
@ManagedProperty("#{sessionScope.some}")
private Some some;
}
值为null
。
@ManagedProperty
在 @ManagedBean
的 creation/instantiation 期间运行。
所以,当 @ManagedBean
创建时 在 第一次设置 #{sessionScope.some}
之前,它仍然会保持 null
@ManagedBean
。它仅在 @ManagedBean
创建 后 首次设置 #{sessionScope.some}
时有效。
基本上可以通过三种方式实现所需的行为。
将private Some some
替换为externalContext.getSessionMap().get("some")
。
@ManagedBean
@SessionScoped
public class SomeOtherBean {
public void someMethod() {
Some some = (Some) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("some");
// ...
}
}
将@SessionScoped
替换为@RequestScoped
。
@ManagedBean
@RequestScoped
public class SomeOtherBean {
@ManagedProperty("#{sessionScope.some}")
private Some some;
// ...
}
替换externalContext.getSessionMap().put("some", some)
直接设置为bean属性.
@ManagedBean
public class SomeBean {
@ManagedProperty("#{someOtherBean}")
private SomeOtherBean someOtherBean;
public void someMethod() {
// ...
someOtherBean.setSome(some);
}
// ...
}
另请参阅:
- How to choose the right bean scope?
我知道我可以 put/get 像这样的会话范围变量。
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put(SESSION_KEY_SOME, some);
那我不能这样访问值吗?
@ManagedBean
@SessionScoped
public class SomeOtherBean {
@ManagedProperty("#{sessionScope.some}")
private Some some;
}
值为null
。
@ManagedProperty
在 @ManagedBean
的 creation/instantiation 期间运行。
所以,当 @ManagedBean
创建时 在 第一次设置 #{sessionScope.some}
之前,它仍然会保持 null
@ManagedBean
。它仅在 @ManagedBean
创建 后 首次设置 #{sessionScope.some}
时有效。
基本上可以通过三种方式实现所需的行为。
将
private Some some
替换为externalContext.getSessionMap().get("some")
。@ManagedBean @SessionScoped public class SomeOtherBean { public void someMethod() { Some some = (Some) FacesContext.getCurrentInstance() .getExternalContext().getSessionMap().get("some"); // ... } }
将
@SessionScoped
替换为@RequestScoped
。@ManagedBean @RequestScoped public class SomeOtherBean { @ManagedProperty("#{sessionScope.some}") private Some some; // ... }
替换
externalContext.getSessionMap().put("some", some)
直接设置为bean属性.@ManagedBean public class SomeBean { @ManagedProperty("#{someOtherBean}") private SomeOtherBean someOtherBean; public void someMethod() { // ... someOtherBean.setSome(some); } // ... }
另请参阅:
- How to choose the right bean scope?