"@inject" -ed 属性保持空



我试图将服务注入到我的bean中,但它始终是null。我得到以下错误:WELD-001000错误解析属性userBean对base 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();
    }
}

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

@SessionScoped
public class UserBean implements Serializable {
    @Inject UserService service;
    private User user;
    public UserBean() {
    }
   @PostConstruct
    void init(){
        this.user = service.findUser("kaas"); 
    }
  }

阅读文档

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

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

如果依赖注入器在 bean创建之后开始它的工作那么对构造函数内部服务的调用将引发NullPointerException(因为当时service仍然是null)。在UserBean构造函数中捕捉npe是值得检查的。如果你捕获了一个——voilo——依赖注入器在bean创建后开始运行,因此,我们不能在类实例化期间使用注入的服务(在构造函数中=)


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

public class UserBean implements Serializable {
    static class UserServiceProvider {
      @Inject static UserService service;
    }
    // ... 
    public UserBean() {
      this.user = UserServiceProvider.service.findUser("kaas"); 
    }
    // ...
}

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

最新更新