我试图向我的bean注入一个服务,但它总是为空.
我得到以下错误:WELD-001000解决属性userBean对基数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(因为当时的服务仍然是空的).值得检查一下,尝试在UserBean构造函数中捕获NPE一段时间.如果你抓到一个 – voilà – 依赖注入器在创建bean之后开始运行,因此,在类实例化(=在构造函数中)我们不能使用注入的服务,
解决方法:实现一个小的服务提供者助手类 – 内部类可以工作:
- public class UserBean implements Serializable {
- static class UserServiceProvider {
- @Inject static UserService service;
- }
- // ...
- public UserBean() {
- this.user = UserServiceProvider.service.findUser("kaas");
- }
- // ...
- }
未经过测试但可以工作 – 在将其用于bean构造函数之前,应将服务注入到提供者类中.