Java &引用@注入-属性保持为空

Java &引用@注入-属性保持为空,java,jakarta-ee,dependency-injection,java-ee-6,javabeans,Java,Jakarta Ee,Dependency Injection,Java Ee 6,Javabeans,我试图将服务注入我的bean,但它总是null。 我得到了以下错误:WELD-001000错误解析属性userBean与基null的冲突 一些代码片段: index.xhtml UserService.java 错误消息可能是一个提示,JVM无法创建UserBean的实例。以下是一些猜测,必须加以证明: 依赖注入需要依赖注入工具,该工具将UserService的实例注入UserBean。在代码中,您已经在bean实例化期间使用了这个注入实例:您在构造函数中调用注入的服务 如果依赖项注入器在创建b

我试图将服务注入我的bean,但它总是
null
。 我得到了以下错误:WELD-001000错误解析属性userBean与基null的冲突

一些代码片段:

index.xhtml

UserService.java

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

依赖注入需要依赖注入工具,该工具将
UserService
的实例注入
UserBean
。在代码中,您已经在bean实例化期间使用了这个注入实例:您在构造函数中调用注入的服务

如果依赖项注入器在创建bean后开始工作,那么对构造函数内的服务的调用将引发
NullPointerException
(因为
service
当时仍然是
null
)。通过尝试在
UserBean
构造函数中捕捉NPE,可以检查一下这一点。如果捕捉到一个-voilá-dependency injector在创建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"); 
    }

  }

阅读

似乎是这样,我该如何解决这个问题?@Martijn v E按规范依赖注入发生在构造函数之后。@Andreas_D谢谢你只是好奇,有没有办法知道依赖注入何时开始工作?
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();
    }
}
public class UserBean implements Serializable {
    static class UserServiceProvider {
      @Inject static UserService service;
    }

    // ... 

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

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

    }

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

  }