“@inject”-ed 属性保持空

我正在尝试将服务注入我的Bean中,但它始终是.我收到以下错误:WELD-001000 解析属性 userBean 时针对基值 null 时出错。null

一些代码片段:

索引.xhtml

<h:body>
    Hello from Facelets
    #{userBean.name}
</h:body>

用户豆.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";
    }
}

用户服务.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();
    }
}

答案 1

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

@SessionScoped
public class UserBean implements Serializable {
    @Inject UserService service;
    private User user;
    public UserBean() {

    }

   @PostConstruct
    void init(){
        this.user = service.findUser("kaas"); 
    }

  }

阅读文档


答案 2

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

依赖关系注入需要依赖关系注入器,该工具可将 的实例注入到 .在你的代码中,你已经在 Bean 的实例化期间使用了这个注入的实例:你在构造函数中调用注入的服务。UserServiceUserBean

如果依赖注入器在创建 Bean 启动其工作,对构造函数内部服务的调用将引发一个(因为当时仍在)。值得通过尝试在构造函数中捕获 NPE 来检查一下。如果你抓住了一个 - 瞧 - 依赖注入器在bean被创建后开始运行,因此,我们不能在类实例化期间使用注入的服务(=在构造函数中)NullPointerExceptionservicenullUserBean


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

public class UserBean implements Serializable {
    static class UserServiceProvider {
      @Inject static UserService service;
    }

    // ... 

    public UserBean() {
      this.user = UserServiceProvider.service.findUser("kaas"); 
    }

    // ...
}

未经测试但可以工作 - 在 bean 构造函数中使用它之前,应先在提供程序类中注入服务。


推荐