我不能使用@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} 时有效。

基本上可以通过三种方式实现所需的行为。

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

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

    @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);
        }
    
        // ...
    }
    

另请参阅:

  • How to choose the right bean scope?