0

Glassfish 組み込みプラグインを使用して Arquillian で単体テストを実行しているときに、次の CDI エラーが発生します。

2015-09-18 06:25:24,376 DEBUG | main | org.jboss.weld.Reflection                               | WELD-000620: interface com.SupportedLocales is not declared @Target(METHOD, FIELD, PARAMETER, TYPE). Weld will use this annotation, however this may make the application unportable.  
sept. 18, 2015 6:25:24 AM com.sun.enterprise.v3.server.ApplicationLifecycle deploy  
GRAVE: Exception during lifecycle processing  
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type Set<Locale> with qualifiers @SupportedLocales  
  at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject protected com.MyClass(@SupportedLocales Set<Locale>)  
  at com.MyClass.<init>(MyClass.java:0)  

修飾子 @SupportedLocales を持つ Set(Locale) は、テスト済みの WebArchive にデプロイされたモジュールで定義されます。アーカイブの内容は次のとおりです。

/WEB-INF/
/WEB-INF/lib/
/WEB-INF/lib/commons-lang3-3.3.2.jar
/WEB-INF/lib/commons-configuration-1.10.jar
/WEB-INF/lib/reflections-0.9.9-RC2.jar
/WEB-INF/lib/jcl-over-slf4j-1.7.10.jar
/WEB-INF/lib/slf4j-api-1.7.10.jar
/WEB-INF/lib/deltaspike-core-api-1.5.0.jar
/WEB-INF/lib/commons-util-1.0.0-SNAPSHOT.jar
/WEB-INF/lib/commons-io-2.4.jar
/WEB-INF/lib/guava-16.0.1.jar
/WEB-INF/lib/log4j-over-slf4j-1.7.10.jar
/WEB-INF/lib/javassist-3.18.2-GA.jar
/WEB-INF/lib/logback-classic-1.1.2.jar
/WEB-INF/lib/logback-core-1.1.2.jar
/WEB-INF/lib/jul-to-slf4j-1.7.10.jar
/WEB-INF/lib/commons-cdi-1.0.0-SNAPSHOT.jar
/WEB-INF/lib/xml-apis-1.0.b2.jar
/WEB-INF/lib/deltaspike-core-impl-1.5.0.jar
/WEB-INF/lib/dom4j-1.6.1.jar
/WEB-INF/lib/commons-codec-1.9.jar
/WEB-INF/lib/commons-lang-2.6.jar
/WEB-INF/lib/annotations-2.0.1.jar
/WEB-INF/lib/libphonenumber-7.0.3.jar
/WEB-INF/classes/
/WEB-INF/classes/com/
/WEB-INF/classes/com/timm/
/WEB-INF/classes/com/timm/common/
/WEB-INF/classes/com/timm/common/cdi/
/WEB-INF/classes/com/timm/common/cdi/web/
/WEB-INF/classes/com/timm/common/cdi/web/i18n/
/WEB-INF/classes/com/timm/common/cdi/web/i18n/ShiroCurrentLocale.class
/WEB-INF/beans.xml

このオブジェクトは、「common-cdi」モジュールにあるプロデューサー メソッドによって提供されます。同じモジュールが ThreadScoped のような CDI 拡張機能を提供します。このプロデューサーは、テストの開始時に Weld によって検出されず、Weld は「commons-cdi」モジュールから Bean を検出しません。それはどのように可能ですか?同じモジュールで CDI 拡張機能と CDI Bean を提供できますか?

@SupportedLocales は、「commons-cdi」で次のように宣言されています。

@Qualifier  
@Target({  
        ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD  
})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface SupportedLocales {  
}

プロデューサーは、「commons-cdi」で次のように宣言されています。

@Dependent  
public class I18NProducer {  
    @Produces  
    @ApplicationScoped  
    @Default  
    @SupportedLocales  
    public Set<Locale> getSupportedLocales() {  
        Set<Locale> supportedLocales;  
        supportedLocales = new HashSet<Locale>();  
        supportedLocales.add(Locale.US);  
        return supportedLocales;  
    }  
}

JUnit テスト ケース定義:

@RunWith(Arquillian.class)
public class LocaleInjectionTest {

    @Deployment
    public static Archive<?> deploy() {
        final String moduleName = LocaleInjectionTest.class.getSimpleName();

        PomEquippedResolveStage resolver = Maven.resolver().loadPomFromFile("pom.xml");

        File[] libs = resolver.resolve("com.myname:commons-cdi").withTransitivity().asFile();

        WebArchive testWar = ShrinkWrap
                .create(WebArchive.class, moduleName + ".war")
                .addClass(MyCurrentLocale.class)
                .addAsLibraries(libs)
                .addAsWebInfResource(ArchiveUtils.getResourceBeanXMLWithAlternativeAndDiscoveryModeAnnotated(MyCurrentLocale.class),
                        "beans.xml");

        return testWar;
    }

    @Inject
    private CurrentLocale bean;

    @Test
    public void testInjection() throws Exception {
        ...
    }
}

MyCurrentLocale クラス定義:

    @SessionScoped
    @Alternative
    public class MyCurrentLocale extends DefaultCurrentLocale implements Serializable {

        @Inject
        protected MyCurrentLocale(@SupportedLocales Set<Locale> supportedLocales) {
            super(supportedLocales);
        }
       ...
   }

宣言に何か問題がありますか?

4

1 に答える 1

0

GlassFish v3 を使用しているように見えるので、Bean アーカイブであるだけでなく、jar ファイルに beans.xml ファイルが必要です。

于 2015-09-21T02:04:09.280 に答える