问题 “@inject”-ed属性保持为null


我试图将服务注入我的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();
    }
}

4292
2018-04-14 09:22


起源



答案:


错误消息 可以 是一个提示,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构造函数中使用它。


6
2018-04-14 09:53



那似乎就是这样,我该如何解决这个问题呢? - martijnve
@Martijn v E - 想一个解决方案,看看我上次编辑:) - Andreas_D
@Martijn v E通过规范依赖注入在构造函数之后发生。 - Laures
@Andreas_D谢谢你 - Pushkarraj Pujari


答案:


错误消息 可以 是一个提示,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构造函数中使用它。


6
2018-04-14 09:53



那似乎就是这样,我该如何解决这个问题呢? - martijnve
@Martijn v E - 想一个解决方案,看看我上次编辑:) - Andreas_D
@Martijn v E通过规范依赖注入在构造函数之后发生。 - Laures
@Andreas_D谢谢你 - Pushkarraj Pujari


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

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

    }

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

  }

文档


6
2017-10-24 19:23