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 に入れると、print ステートメントは引き続き出力されますが、@Resource は機能せず、EJB NPE はプロデューサ メソッドなどによって返された null DS にありました。両方のテストで、修飾子は Shared.jar にとどまりました。とにかく、どこにもDDはありません(まあ、戦争のためのweb.xml-他のすべては暗黙的です)

私の一部は、これは少し理にかなっていると思います。@Resource は一種の EE 指向です (またはいいえ?)。ほとんどの場合、展開可能な EE 内で意味をなすはずです。

OTOH、(EAR 内の) すべての EJBJar と WAR が使用できる EAR の lib ディレクトリにある共有 JAR に、修飾子といくつかのプロデューサーを一握り持つことができないのはなぜですか?

これを機能させる方法はありますか?

本当に必要な場合は、ここで例全体を見ることができます: https://github.com/fwelland/ResJect

4

2 に答える 2

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>
于 2013-12-04T10:35:28.410 に答える
0

GlassFish 4 を使用している場合は、Java EE 6 ではなく Java EE 7 を使用していることに注意してください。状況を機能させるには、共有 jar をモジュールとして に登録する必要がありますapplication.xml。それ。

于 2013-10-18T11:29:51.943 に答える