2011-04-14 50 views
10

我试图向我的bean注入服务,但始终是null。 我收到以下错误:WELD-001000解决属性userBean针对基本null错误。“@inject”-ed属性保留为空

一些代码片段:

的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(); 
    } 
} 

回答

6

错误消息可能是一种提示,在JVM无法创建UserBean一个实例。下面是一些猜测,并就必须证明:

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

如果依赖注入启动是创建豆下班后然后调用构造函数里面的服务将引发NullPointerException(因为service仍然是null当时)。通过尝试在UserBean构造函数中捕获NPE一段时间,值得检查。如果你发现一个 - 瞧 - 依赖注入启动bean已经被创建后捉迷藏,并作为一个结果,类的实例(=在构造函数)


解决方法的想法时,我们不能用注射服务:实现小型服务提供商的辅助类 - 内部类可以工作:

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

    // ... 

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

    // ... 
} 

未经测试,但可能工作 - 服务应该在供应商类您在豆类构造函数中使用它之前注入。

+0

这似乎是的情况下,如何将我解决这一问题? – martijnve 2011-04-14 09:55:25

+1

@Martijn v E - 想到一个解决方案,看我最后的编辑:) – 2011-04-14 10:01:23

+4

@Martijn v规范依赖注入E发生后的构造函数。 – Laures 2011-04-14 20:50:09

6

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

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

    } 

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

    } 

docs