【问题标题】:@Resource Injection in jar in 'lib' of an ear; why doesn't that work?@Resource Injection in jar in an 'lib' of an ear;为什么这不起作用?
【发布时间】:2013-10-17 20:59:11
【问题描述】:

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

耳朵包含:

EJBJar

战争

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 不起作用,并且 EJB NPE 位于生产者方法返回的空 DS 上。在这两个测试中,限定符都保留在 Shared.jar 中。反正我在哪里都没有 DD(嗯,战争的 web.xml —— 其他都是隐含的)

我的一部分认为这有点道理; @Resource 有点面向 EE(或者不是?);并且应该在可部署的 EE 中最有意义。

OTOH,为什么我不能在 EAR 的 lib 目录中的 Shared JAR 中拥有所有 EJBJars 和 WAR(在 EAR 中)都可以使用的所有限定符和一些生产者?

有没有办法让它工作?

如果你真的想要——你可以在这里看到一个完整的例子:https://github.com/fwelland/ResJect

【问题讨论】:

    标签: dependency-injection glassfish java-ee-6 cdi


    【解决方案1】:

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

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

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

    提示:使用 maven-ear-plugin 您可以自动将依赖项作为模块添加到您的耳朵

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好吧(回复:ee6 v ee7)——我想我真正的意思是我希望坚持使用 EE6 规范和功能,即使我可能在支持 EE7 的服务器上运行。
      • 无论如何,我认为我在另一篇 SO 帖子中发现了类似的内容,但针对不同的问题。您指的是&lt;module&gt;&lt;java&gt;shared.jar&lt;/java&gt;&lt;/module&gt; 对吗?我以为&lt;java&gt;shared.jar&lt;/java&gt; 仅适用于 EE 应用程序客户端?
      • 对,它需要定义为 EJB 模块而不是应用程序客户端模块,即使您没有在其中定义任何 EJB(实际上使用 ejb 模块是在这一点上用词不当)。 RE ee6 vs ee7,无论何时您在 eeX 应用服务器上,您都需要遵循该 ee 规范的规则,而不管您可能想要遵循的规则。
      • so Share.jar 在 application.xml 中不起作用:GF4 抱怨:部署应用程序时出现异常 [ResJect]:无效的 ejb jar 共享.jar:它包含零 ejb。一个有效的 ejb jar 至少需要一个会话/实体/消息驱动 bean。
      • 我根本没想到会有这样的结果。我需要仔细查看规范,看看这是否是 GF4 错误。尝试一个 java 模块,即使它是用于应用程序客户端的,它可能仍然适用于您的用例。
      猜你喜欢
      • 2022-12-27
      • 2017-02-03
      • 2022-12-02
      • 2022-12-01
      • 2022-12-02
      • 2017-04-07
      • 2022-12-02
      • 2020-01-29
      • 1970-01-01
      相关资源
      最近更新 更多