java – “@inject”的属性保持为空

我试图向我的bean注入一个服务,但它总是为空.
我得到以下错误: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构造函数之前,应将服务注入到提供者类中.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...