2013-10-17 13 views
2

我有簡單耳(GF 4.0,JDK 7;與EE6粘現在)@耳朵的'lib'中的jar中的資源注入;爲什麼不工作?

耳包含:

EJBJar

WAR

LIB/Shared.jar

Shared有一個@Qualifier(@UserDS)(它也有META-INF/beans.xml)。

我有一個@Producer這樣的:

package fhw.producers; 
import fhw.qaulifiers.ListingDS; 
import fhw.qaulifiers.UserDS; 
import javax.annotation.Resource; 
import javax.sql.DataSource; 
import javax.enterprise.inject.Default; 
import javax.enterprise.inject.Produces; 

@Default 
public class DataSourceProducer 
{ 
    @Resource(lookup = "Member") 
    private DataSource userDS;   

    public DataSourceProducer() 
    { 
     System.err.println("DataSourceProducer.DataSourceProducer -- CONSTRUCTION"); 
    } 

    @Produces 
    @UserDS 
    public DataSource getUserDataSource() 
    { 
     System.err.println("******DataSourceProducer.getUserDataSource; am I null? " + (null == userDS)) ; 
     return userDS; 
    } 
} 

我有一個簡單的EJB(它有一個beans.xml文件),其通過使用它:

@Inject 
    @UserDS 
    private DataSource userDS; 

問題:當我將DataSourceProducer放入EJBJAR中並進行部署;我的打印聲明出來了,我的@Resource解決了,一切都很好。當我把DataSourceProducer放入Shared.jar時;打印語句仍然出來,但@Resource不起作用,生產者方法返回的空DS上的EJB NPE等。在兩次測試中,限定符都停留在Shared.jar中。無論如何,我沒有任何DD(很好的戰爭的web.xml - 所有其他都是隱含的)

我的一部分認爲這有點道理; @Resource是一種面向EE的(或不是?);並且應該在可部署EE的情況下最有意義。爲什麼我不能讓所有EJBJars和WARs(在EAR中)的EAR的lib目錄中的共享JAR中的限定符和一些生產者手工充滿?

有沒有辦法讓這項工作?

如果你真的想 - 你可以在這裏看到一個完整的例子:如果你使用的是GlassFish 4,你使用的是Java EE 7 https://github.com/fwelland/ResJect

回答

0

注意,而不是Java EE 6,爲了讓您的情況下工作,您需要將您的共享jar註冊爲application.xml中的模塊,以便它知道要掃描它。

+0

好耶(RE:EE6 v EE7) - 我想我真正的意思是,我希望堅持EE6的規格和功能,儘管我可能在EE7服務器上運行。 – fwelland

+0

無論如何,我認爲我在另一個SO帖子中發現了一個類似的東西,但是對於另一個問題。你指的是' shared.jar'正確嗎?我以爲' shared.jar'只是爲了EE應用程序客戶端? – fwelland

+0

對,它需要被定義爲一個EJB模塊而不是一個應用程序客戶端模塊,即使您沒有定義任何EJB(實際上使用ejb模塊在這一點上是錯誤的)。 RE ee6 vs ee7,無論何時您使用eeX應用程序服務器,都需要遵循該ee規範的規則,而不管您希望遵循哪些規則。 –

1

我在GF3上遇到了同樣的問題,但解決方案看起來一樣。

刪除lib目錄中的依賴項並將其添加到耳根。 然後添加以下的application.xml

<module><ejb>Shared.jar</ejb></module> 

提示:使用maven-耳插件,你可以自動添加依賴關係模塊,以你的耳朵

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-ear-plugin</artifactId> 
    <configuration> 
     <displayName>...</displayName> 
     <application-name>...</application-name> 
     <defaultJavaBundleDir>lib</defaultJavaBundleDir> 
     <!-- not generate application.xml! we include it ourselves --> 
     <generateApplicationXml>false</generateApplicationXml> 
     <modules> 
      <ejbModule> 
       <groupId>...</groupId> 
       <artifactId>Shared</artifactId> 
       <bundleFileName>Shared.jar</bundleFileName> 
      </ejbModule> 
      </modules> 
     </configuration> 
</plugin>