2014-02-09 29 views
0

(UPDATED)@Resource注入JBoss AS中7不起作用

我已經jboss-as-7.1.1.Final部署Web應用程序作爲獨立的,我有一個啓動類爲以下初始化的正常工作:

@Startup 
@Singleton 
public class StartupBean { 

    @PostConstruct 
    void init() { 
    EmailSenderService emailSenderService = new EmailSenderService(); 
    emailSenderService.testMail(); 
    } 
} 

問題是在定義爲以下的其他類:

@Stateless 
public class EmailSenderService { 

    @Resource(mappedName="java:jboss/mail/Default") 
    private Session mailSession; 

    @PostConstruct 
    public void testMail(){ 
     if(mailSession == null){ 
      System.out.println("NULL"); 
     } 
    } 
} 

啓動應用程序■當erver,該方法由啓動類調用,但mailSession屬性未由容器初始化併爲空。

我在我的JBoss standalone.xml以下配置:

<subsystem xmlns="urn:jboss:domain:mail:1.0"> 
    <mail-session jndi-name="java:jboss/mail/Default"> 
     <smtp-server outbound-socket-binding-ref="mail-smtp"> 
     </smtp-server> 
    </mail-session> 
</subsystem> 

任何想法,爲什麼郵件會話沒有容器初始化?

雖然這是一個Web應用程序,但我需要在HTTP請求之前進行一些初始化,這就是爲什麼我使用@StartUp類和其他東西。

Regards

回答

1

@Resource註釋必須在bean類中使用。在你的情況中,在EmailSenderService 中定義的註釋僅由EJB容器忽略。

According to ejb 3.1 specification:

簡單的環境條目中使用批註的16.4.1.1Injection。

Bean提供者使用資源註釋來註釋豆類的字段或方法作爲目標 用於注入簡單環境條目。

另請注意,該字段不能是靜態的。

16.2.2註釋環境條目。

該字段或方法可能具有任何訪問限定符(公共,私有等),但不能是靜態的。

+0

親愛的加百列,你提到了兩點;首先感謝,因爲我不知道他們;我這樣應用它們:我用無狀態註釋定義了EmailSenderService類,使它成爲一個bean類,並且我從mailSession屬性中刪除了static關鍵字(檢查問題中的更新);我重新發布了我的項目給JBoss,但仍然是一樣的; mailSession爲null。我甚至爲testMail()方法嘗試了PostConstruct,以確保所有資源注入都已完成,但在該調用中也爲空。任何其他想法? –

+1

問題是您正在使用自己創建的實例而非Container創建的實例: EmailSenderService emailSenderService = new EmailSenderService() 這是一個簡單的POJO,它不受容器管理,查看bean [工作] (http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html) –

+0

我檢查了你的鏈接,讓容器通過@EJB實例化EmailSenderService類,並解決了問題。謝謝 –