“@inject”-ed属性保持为null

我试图将一个服务注入我的bean但它始终为null 。 我收到以下错误:WELD-001000错误解析属性userBean对基础null。

一些代码片段:

的index.xhtml

  Hello from Facelets #{userBean.name}  

userbean.java

 package beans; import Domain.User; import java.io.Serializable; import javax.enterprise.context.SessionScoped; import javax.inject.Inject; import javax.inject.Named; import service.UserService; @Named @SessionScoped public class UserBean implements Serializable{ @Inject UserService service; private User user; public UserBean(){ this.user = service.find_user("foo"); } public String getName(){ return "bar"; } } 

UserService.java

 package service; import Domain.User; import javax.ejb.Stateless; import javax.inject.Named; @Named @Stateless public class UserService { public UserService(){} public User find_user(String name){ return new User(); } } 

错误消息可能是一个提示,即JVM无法创建UserBean的实例。 以下是一些猜测,必须certificate:

Dependecy Injection需要一个dependency injection器,一个 UserService实例注入UserBean 。 在你的代码中,你已经在bean的实例化过程中使用了这个注入的实例:你在构造函数中调用注入的服务。

如果dependency injection器创建bean 之后启动它的工作, 那么对构造函数内部服务的调用将引发NullPointerException (因为此时service仍然为null )。 通过尝试在UserBean构造函数中捕获NPE一会儿值得检查。 如果你抓住了一个 – 瞧 – dependency injection器在创建bean之后开始运行,因此,我们不能在类实例化期间使用注入的服务(=在构造函数中)


解决方法的想法:实现一个小型服务提供者帮助程序类 – 内部类可以工作:

 public class UserBean implements Serializable { static class UserServiceProvider { @Inject static UserService service; } // ... public UserBean() { this.user = UserServiceProvider.service.findUser("kaas"); } // ... } 

未经测试但可以工作 – 在bean构造函数中使用服务之前,应该在提供者类中注入服务。

另一种方法是使用@PostConstruct方法注释。

 @SessionScoped public class UserBean implements Serializable { @Inject UserService service; private User user; public UserBean() { } @PostConstruct void init(){ this.user = service.findUser("kaas"); } } 

阅读文档