Jsf 像@ManagedProperty和@PostConstruct这样的Bean注释不';当从另一个bean手动实例化bean时,它不起作用
我从另一个请求bean实例化了一个请求beanJsf 像@ManagedProperty和@PostConstruct这样的Bean注释不';当从另一个bean手动实例化bean时,它不起作用,jsf,jsf-2,annotations,managed-bean,Jsf,Jsf 2,Annotations,Managed Bean,我从另一个请求bean实例化了一个请求bean new LoginManager(); 但是,使用@ManagedProperty注释的属性不会从请求的引用中获取值,只有在通过上述方式实例化的情况下才可以。它只包含null,导致代码后面出现NPE。另外,@PostConstruct也不会被调用。为什么会这样&我应该如何处理 @ManagedBean(name = "loginManager") @RequestScoped public class LoginManager { pr
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;
}
但是userSession
无法从会话范围的bean中读取,因为该bean是使用以下命令实例化的:new LoginManager()代码>
但是,我可以使用FacesContext
读取值 您不应该使用new
操作符手动实例化(管理)bean。您应该让JSF来管理bean,而不是获取JSF托管(JSF实例化)实例
通过bean中您需要的@ManagedProperty
:
@ManagedProperty("#{loginManager}")
private LoginManager loginManager;
或者通过编程方式调用EL(在您的特定情况下,这非常接近):
如果您坚持自己实例化和管理bean,那么您应该自己进行所有依赖注入,也可以自己调用@PostConstruct
,如果有的话,最后还可以自己将bean放入所需的范围。例如
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应该从您手中拿走的东西。利用它。您不应该使用new
操作符手动实例化(管理)bean。您应该让JSF来管理bean,而不是获取JSF托管(JSF实例化)实例
通过bean中您需要的@ManagedProperty
:
@ManagedProperty("#{loginManager}")
private LoginManager loginManager;
或者通过编程方式调用EL(在您的特定情况下,这非常接近):
如果您坚持自己实例化和管理bean,那么您应该自己进行所有依赖注入,也可以自己调用@PostConstruct
,如果有的话,最后还可以自己将bean放入所需的范围。例如
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应该从您手中拿走的东西。利用它。完美!非常感谢你!在这两种方法中(使用@ManagedProperty&evaluateExpressionGet
),如果bean已经存在,那么它们将被检索到,对吗?所以我甚至不需要检查bean是否已经实例化过&我可以直接使用,对吗?这是正确的。JSF只会在范围中不存在的情况下创建它,否则它只会返回现有的实例。完美!非常感谢你!在这两种方法中(使用@ManagedProperty&evaluateExpressionGet
),如果bean已经存在,那么它们将被检索到,对吗?所以我甚至不需要检查bean是否已经实例化过&我可以直接使用,对吗?这是正确的。JSF只会在范围中还不存在的情况下创建它,否则它只会返回现有实例。