2015-09-20 5 views
0

Во время выполнения теста блока с Arquillian исполейся Glassfish встроенного плагина, я получаю следующее сообщение об ошибке CDI:продюсера обнаружить с помощью Weld в Arquillian процесса

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) 

Set (Locale) с квалификационными @SupportedLocales определяются в модуле развернутых в тестируемом 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». Тот же модуль обеспечивает функцию расширения CDI, например ThreadScoped. Этот производитель не обнаружен Weld во время запуска теста, и Weld не обнаруживает бобы из модуля commons-cdi. Как это возможно? Можем ли мы предоставить функции расширения CDI и CDI-компоненты в том же модуле?

@SupportedLocales является заявляет в "Обще-ЦПИ" с:

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

Производитель объявлен в "Обще-ЦПИ" с:

@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); 
     } 
     ... 
    } 

В чем проблема?

+0

Не могли бы вы добавить свой тестовый класс и класс с точкой впрыска для Set ? –

+0

Я добавляю его к исходному сообщению. – ruddy32

ответ

0

Похоже, вы используете GlassFish v3, поэтому вам понадобится файл beans.xml в банке, а также это бобовый архив.

+0

содержит компонент beans.xml. В проекте используется GF Embedded 4.1. – ruddy32

+0

Хмм, stacktrace говорит v3. У вас есть разумная проблема с управляемым или удаленным контейнером? – LightGuard

+0

Проект ссылается на GF embedded 4.1 и Arquillian GF Embedded 3.1 CR4 - эта версия уже протестирована с GF4. Проект использует только контейнер управления. В архиве GF embedded 4.1 есть пакет . – ruddy32

Смежные вопросы