我不能使用@ManagedProperty访问会话范围变量吗?

时间:2016-11-11 06:37:50

标签: jsf session-scope managed-property

我知道我可以像这样放置/获取会话范围变量。

FacesContext.getCurrentInstance().getExternalContext()
    .getSessionMap().put(SESSION_KEY_SOME, some);

然后我不能像这样访问这个值吗?

@ManagedBean
@SessionScoped
public class SomeOtherBean {

    @ManagedProperty("#{sessionScope.some}")
    private Some some;
}

值为null

1 个答案:

答案 0 :(得分:1)

@ManagedProperty在创建/实例化@ManagedBean期间运行。

因此,如果之前创建了@ManagedBean,则#{sessionScope.some}首次设置,那么null仍将保留@ManagedBean @ManagedBean }。只有在第一次设置#{sessionScope.some} 之后创建private Some some时,它才会有效。

基本上有三种方法可以达到预期的行为。

  1. externalContext.getSessionMap().get("some")替换为@ManagedBean @SessionScoped public class SomeOtherBean { public void someMethod() { Some some = (Some) FacesContext.getCurrentInstance() .getExternalContext().getSessionMap().get("some"); // ... } }

    @SessionScoped
  2. @RequestScoped替换为@ManagedBean @RequestScoped public class SomeOtherBean { @ManagedProperty("#{sessionScope.some}") private Some some; // ... }

    externalContext.getSessionMap().put("some", some)
  3. 通过直接将其设置为bean属性来替换@ManagedBean public class SomeBean { @ManagedProperty("#{someOtherBean}") private SomeOtherBean someOtherBean; public void someMethod() { // ... someOtherBean.setSome(some); } // ... }

    xcdatamodel
  4. 另见: