我从另一个请求bean中实例化了一个请求bean,
new LoginManager();
但是,使用@ManagedProperty
注释的属性不会从所请求的引用中获取值,仅在通过上述方式实例化的情况下。它只包含null
,后来在代码中导致NPE。此外,@PostConstruct
也不会被调用。它为什么如此&我该怎么处理这个?
@ManagedBean(name = "loginManager")
@RequestScoped
public class LoginManager {
private String userid;
private String password;
@ManagedProperty(value="#{currentSession}")
private UserSessionManager userSession;
}
但是当使用以下方法实例化此bean时,userSession
无法从会话范围bean读取:new LoginManager();
但是我可以使用FacesContext
来阅读该值!
答案 0 :(得分:4)
您不应使用new
运算符手动实例化(管理)bean。您应该让JSF完成管理bean的工作,而是获取JSF管理的(JSF实例化的)实例。
在你需要它的bean中@ManagedProperty
:
@ManagedProperty("#{loginManager}")
private LoginManager loginManager;
或者通过编程方式调用EL(在特定情况下这是非常临界的):
LoginManager loginManager = context.getApplication().evaluateExpressionGet(context, "#{loginManager}", LoginManager.class);
// ...
如果你坚持自己实例化和管理bean,你应该自己进行所有依赖注入,也可以自己调用@PostConstruct
,最后自己也将bean放在所需的范围内。 E.g。
LoginManager loginManager = new LoginManager();
loginManager.setUserSession(userSession);
// Now use reflection to find and invoke @PostConstruct method.
// Finally store in the map which conforms the bean's scope.
externalContext.getRequestMap().put("loginManager", loginManager);
这个样板正是JSF应该从你手中拿走的东西。利用它。