1

2 つの EAR があります。EAR A は実際のアプリケーションで、EAR B はデバッグとテストに使用されます。

EAR A には、@Name で注釈が付けられたすべての Seam コンポーネント クラスを持つ JAR A が含まれます。EAR A には、Seam 2.3 webapp である WAR A が含まれ、components.xml ですべてのコンポーネントを定義します。これはうまくいきます。

EAR B には、EAR A から WAR A を削除した別の WAR B が含まれています。EAR B は、jboss-deployment-structure.xml でサブデプロイメント「JAR A」への依存関係を正しく定義します。WAR B は、JAR A からいくつかのコンポーネントのみを定義しますが、webapp のデプロイ中に初期化に失敗します。これは次の原因で発生します。

java.lang.IllegalArgumentException: Component class must have @Name annotation or name must be specified in components.xml: [name of my class]

初期化をデバッグし、Seam クラス org.jboss.seam.init.Initialization:488 にブレークポイントを設定すると

        if ( !clazz.isAnnotationPresent(Name.class) )
        {
           throw new IllegalArgumentException(
                    "Component class must have @Name annotation or name must be specified in components.xml: " +
                    clazz.getName());
        }

        name = clazz.getAnnotation(Name.class).value();

if 条件が false です。しかし、デバッガーで clazz の注釈を調べると、注釈が正しい値であることがわかります。

interface org.jboss.seam.annotations.Name=@org.jboss.seam.annotations.Name(value=org.jboss.seam.security.identity)

WAR B を EAR A に移動すると、すべてが機能するため、これは 2 つの異なるデプロイメント (つまり、クラスローダー) で @Name アノテーションをロードすることと関係があると思われます。私が正しいかどうか、またはこれを達成する方法があるかどうかを教えてください。

4

1 に答える 1