2

我的耳朵很简单(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,为什么我不能让所有 EJBJars 和 WAR(在 EAR 中)都可以使用的 EAR 的 lib 目录中的 Shared JAR 中拥有大量的限定符和一些生产者?

有没有办法使这项工作?

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

4

2 回答 2

1

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

从 lib 目录中删除依赖项并将其添加到耳朵的根目录。然后将以下内容添加到 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>
于 2013-12-04T10:35:28.410 回答
0

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

于 2013-10-18T11:29:51.943 回答