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

前端之家收集整理的这篇文章主要介绍了java – “@inject”的属性保持为空前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图向我的bean注入一个服务,但它总是为空.
我得到以下错误:WELD-001000解决属性userBean对基数null.

一些代码段:

的index.xhtml

  1. <h:body>
  2. Hello from Facelets
  3. #{userBean.name}
  4. </h:body>

userbean.java

  1. package beans;
  2.  
  3. import Domain.User;
  4. import java.io.Serializable;
  5. import javax.enterprise.context.SessionScoped;
  6. import javax.inject.Inject;
  7. import javax.inject.Named;
  8. import service.UserService;
  9.  
  10. @Named
  11. @SessionScoped
  12. public class UserBean implements Serializable{
  13. @Inject UserService service;
  14. private User user;
  15.  
  16. public UserBean(){
  17. this.user = service.find_user("foo");
  18. }
  19.  
  20. public String getName(){
  21. return "bar";
  22. }
  23. }

UserService.java

  1. package service;
  2.  
  3. import Domain.User;
  4. import javax.ejb.Stateless;
  5. import javax.inject.Named;
  6.  
  7. @Named
  8. @Stateless
  9. public class UserService {
  10. public UserService(){}
  11.  
  12. public User find_user(String name){
  13. return new User();
  14. }
  15. }

解决方法

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

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

如果依赖注入器在bean被创建之后启动它,那么对构造函数内的服务的调用会引发一个NullPointerException(因为当时的服务仍然是空的).值得检查一下,尝试在UserBean构造函数中捕获NPE一段时间.如果你抓到一个 – voilà – 依赖注入器在创建bean之后开始运行,因此,在类实例化(=在构造函数中)我们不能使用注入的服务,

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

  1. public class UserBean implements Serializable {
  2. static class UserServiceProvider {
  3. @Inject static UserService service;
  4. }
  5.  
  6. // ...
  7.  
  8. public UserBean() {
  9. this.user = UserServiceProvider.service.findUser("kaas");
  10. }
  11.  
  12. // ...
  13. }

未经过测试但可以工作 – 在将其用于bean构造函数之前,应将服务注入到提供者类中.

猜你在找的Java相关文章