我试图将服务注入我的bean,但它总是 null
。
我收到以下错误:WELD-001000错误解析属性userBean对基础null。
一些代码片段:
的index.xhtml
<h:body>
Hello from Facelets
#{userBean.name}
</h:body>
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
。以下是一些猜测,必须证明:
Dependecy Injection需要一个依赖注入器,一个工具 内喷射 一个例子 UserService
变成一个 UserBean
。在你的代码中,你已经在bean的实例化过程中使用了这个注入的实例:你在构造函数中调用注入的服务。
如果 依赖注入器启动它的工作 后 bean被创建了, 然后 对构造函数内部服务的调用将引发一个 NullPointerException
(因为 service
还是 null
那时候)。通过尝试捕获NPE来检查它是值得的 UserBean
构造函数片刻。如果你抓住了一个 - 瞧 - 依赖注入器在创建bean之后开始运行,因此,我们不能在类实例化期间使用注入的服务(=在构造函数中)
解决方法的想法:实现一个小型服务提供者帮助程序类 - 内部类可以工作:
public class UserBean implements Serializable {
static class UserServiceProvider {
@Inject static UserService service;
}
// ...
public UserBean() {
this.user = UserServiceProvider.service.findUser("kaas");
}
// ...
}
未经测试但可以工作 - 应该在提供者类中注入服务 之前 你在bean构造函数中使用它。
错误消息 可以 是一个提示,JVM无法创建一个实例 UserBean
。以下是一些猜测,必须证明:
Dependecy Injection需要一个依赖注入器,一个工具 内喷射 一个例子 UserService
变成一个 UserBean
。在你的代码中,你已经在bean的实例化过程中使用了这个注入的实例:你在构造函数中调用注入的服务。
如果 依赖注入器启动它的工作 后 bean被创建了, 然后 对构造函数内部服务的调用将引发一个 NullPointerException
(因为 service
还是 null
那时候)。通过尝试捕获NPE来检查它是值得的 UserBean
构造函数片刻。如果你抓住了一个 - 瞧 - 依赖注入器在创建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");
}
}
读 文档