我无法使用@ManagedProperty访问会话范围变量吗?



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

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

那么我不能像这样访问值吗?

@ManagedBean
@SessionScoped
public class SomeOtherBean {
    @ManagedProperty("#{sessionScope.some}")
    private Some some;
}

取值为null

@ManagedProperty@ManagedBean的创建/实例化过程中运行

因此,当@ManagedBean在之前创建时,#{sessionScope.some}第一次被设置,那么它仍然会在@ManagedBean中保留null第一次设置#{sessionScope.some}之后创建@ManagedBean才会起作用

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

  1. externalContext.getSessionMap().get("some")代替private Some some

    @ManagedBean
    @SessionScoped
    public class SomeOtherBean {
        public void someMethod() {
            Some some = (Some) FacesContext.getCurrentInstance()
                .getExternalContext().getSessionMap().get("some");
            // ...
        }
    }
    
  2. @RequestScoped代替@SessionScoped

    @ManagedBean
    @RequestScoped
    public class SomeOtherBean {
        @ManagedProperty("#{sessionScope.some}")
        private Some some;
        // ...
    }
    
  3. 直接将externalContext.getSessionMap().put("some", some)设置为bean属性。

    @ManagedBean
    public class SomeBean {
        @ManagedProperty("#{someOtherBean}")
        private SomeOtherBean someOtherBean;
        public void someMethod() {
            // ...
            someOtherBean.setSome(some);
        }
        // ...
    }
    

参见:

  • 如何选择合适的bean scope?

相关内容

  • 没有找到相关文章

最新更新