Java &引用@注入-属性保持为空
我试图将服务注入我的bean,但它总是Java &引用@注入-属性保持为空,java,jakarta-ee,dependency-injection,java-ee-6,javabeans,Java,Jakarta Ee,Dependency Injection,Java Ee 6,Javabeans,我试图将服务注入我的bean,但它总是null。 我得到了以下错误:WELD-001000错误解析属性userBean与基null的冲突 一些代码片段: index.xhtml UserService.java 错误消息可能是一个提示,JVM无法创建UserBean的实例。以下是一些猜测,必须加以证明: 依赖注入需要依赖注入工具,该工具将UserService的实例注入UserBean。在代码中,您已经在bean实例化期间使用了这个注入实例:您在构造函数中调用注入的服务 如果依赖项注入器在创建b
null
。
我得到了以下错误:WELD-001000错误解析属性userBean与基null的冲突
一些代码片段:
index.xhtml
UserService.java
错误消息可能是一个提示,JVM无法创建UserBean
的实例。以下是一些猜测,必须加以证明:
依赖注入需要依赖注入工具,该工具将UserService
的实例注入UserBean
。在代码中,您已经在bean实例化期间使用了这个注入实例:您在构造函数中调用注入的服务
如果依赖项注入器在创建bean后开始工作,那么对构造函数内的服务的调用将引发NullPointerException
(因为service
当时仍然是null
)。通过尝试在UserBean
构造函数中捕捉NPE,可以检查一下这一点。如果捕捉到一个-voilá-dependency injector在创建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");
}
}
阅读似乎是这样,我该如何解决这个问题?@Martijn v E按规范依赖注入发生在构造函数之后。@Andreas_D谢谢你只是好奇,有没有办法知道依赖注入何时开始工作?
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();
}
}
public class UserBean implements Serializable {
static class UserServiceProvider {
@Inject static UserService service;
}
// ...
public UserBean() {
this.user = UserServiceProvider.service.findUser("kaas");
}
// ...
}
@SessionScoped
public class UserBean implements Serializable {
@Inject UserService service;
private User user;
public UserBean() {
}
@PostConstruct
void init(){
this.user = service.findUser("kaas");
}
}