2011-04-14 72 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