Dependency injection @在'中的jar中注入资源;lib';耳朵;为什么';那不行吗?

Dependency injection @在'中的jar中注入资源;lib';耳朵;为什么';那不行吗?,dependency-injection,glassfish,java-ee-6,cdi,Dependency Injection,Glassfish,Java Ee 6,Cdi,我有一个简单的耳朵(GF 4.0,JDK 7;现在坚持使用EE6) 耳朵包括: 埃比哈尔 战争 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.Resour

我有一个简单的耳朵(GF 4.0,JDK 7;现在坚持使用EE6)

耳朵包括:

埃比哈尔

战争

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中时;print语句仍然会出现,但@Resource不起作用,而EJB NPE在producer方法返回的null DS上运行。在这两个测试中,限定符都保留在Shared.jar中。我在任何地方都没有DDs(用于战争的web.xml——其他都是隐式的)

我的一部分认为这有点道理@资源是一种面向EE的(或者没有?);并且在EE可部署系统中最有意义

OTOH,为什么我不能在EAR的lib dir中的一个共享JAR中放满限定符和一些生产者,所有EJBJAR和WAR(在EAR中)都可以使用

有没有办法让这一切顺利进行


如果您真的想要--您可以在这里看到一个完整的示例:

请注意,如果您使用的是GlassFish 4,那么您使用的是Java EE 7,而不是Java EE 6。为了使您的情况正常工作,您需要在
application.xml
中将共享jar注册为一个模块,以便它知道如何扫描它。

我在GF3上遇到了同样的问题,但解决方案似乎是一样的

从lib目录中删除依赖项并将其添加到ear的根目录中。 然后将以下内容添加到application.xml

<module><ejb>Shared.jar</ejb></module>
Shared.jar
提示:使用maven ear插件,您可以自动将依赖项作为模块添加到ear中

<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>

org.apache.maven.plugins
maven耳朵插件
...
...
解放党
假的
...
共享
Shared.jar

嗯,是的(re:ee6 v ee7)--我想我真正的意思是我希望坚持使用ee6规范和功能,即使我可能运行在支持ee7的服务器上。无论如何,我认为我在另一篇SO帖子中发现了类似的建议,但针对不同的问题。您指的是类似于
shared.jar的内容,对吗?我认为
shared.jar
只是针对EE应用程序客户机的?是的,它需要定义为EJB模块而不是应用程序客户机模块,即使您没有在其中定义任何EJB(实际上,在这一点上使用EJB模块是一个误称)。关于ee6与ee7,无论何时您在eeX应用服务器上,您都需要遵循该ee规范的规则,而不管您可能希望遵循哪些规则。因此Share.jar在application.xml中不起作用。GF4投诉:部署应用程序时异常[ResJect]:无效的ejb jar Shared.jar:它包含零ejb。一个有效的EJBJAR至少需要一个会话/实体/消息驱动bean。我根本没想到会有这样的结果。我需要仔细查看规范,看看这是否是GF4的错误。尝试一个java模块,即使它是针对应用程序客户机的,它也可能适用于您的用例。