当从另一个bean手动实例化bean时,像@ManagedProperty和@PostConstruct这样的Bean注释不起作用

时间:2011-12-07 18:03:38

标签: jsf jsf-2 annotations managed-bean

我从另一个请求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来阅读该值!

1 个答案:

答案 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应该从你手中拿走的东西。利用它。