简体   繁体   中英

Can't I access session scope variable using @ManagedProperty?

I know I can put/get session scope variables like this.

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

Then can't I access the value like this?

@ManagedBean
@SessionScoped
public class SomeOtherBean {

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

The value is null .

@ManagedProperty runs during creation/instantiation of the @ManagedBean .

So, when the @ManagedBean is created before the #{sessionScope.some} is set for first time, then it will still remain null in the @ManagedBean . It will only work when @ManagedBean is created after the #{sessionScope.some} is set for the first time.

There are basically three ways to achieve the desired behavior.

  1. Replace private Some some by externalContext.getSessionMap().get("some") .

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

     @ManagedBean @RequestScoped public class SomeOtherBean { @ManagedProperty("#{sessionScope.some}") private Some some; // ... } 
  3. Replace externalContext.getSessionMap().put("some", some) by directly setting it as bean property.

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

See also:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM