2016-12-20 6 views
0

У меня есть проект maven, который я использую MapStruct для генерации карт, чтобы помочь в переводе сущностей в DTO и наоборот. Эти картотеки генерируются во время фазы генерации источников maven и сохраняются в папках target/generated-sources и target/AppName/WEB-INF/classes.Как сделать класс поиска Weld на сгенерированных источниках

К примеру, у меня есть этот Mapper

@Mapper 
public interface RuleMapper { 

    RuleDto ruletoDto(Rule rule); 

    //other cool stuf 
} 

Я сконфигурировано MapStruct использовать CDI, поэтому он будет генерировать следующее:

@Generated(
value = "org.mapstruct.ap.MappingProcessor", 
date = "2016-12-19T23:19:36-0200", 
comments = "version: 1.1.0.CR1, compiler: javac, environment: Java 1.8.0_112" 
) 
@Singleton 
@Named 
public class RuleMapperImpl implements RuleMapper { 

    @Override 
    public RuleDto ruletoDto(Rule rule) { 

     ruleDto ruleDto = new ruleDto(); 

     if (rule != null) { 
      ruleDto.setIdRule(rule.getIdRule()); 
     } 

     return ruleDto; 
    } 
} 

Он работает perfectely при работе на сервере Wildfly, проблема заключается в том, что я пытаюсь выполнить проверку этого класса, для этого я внедрил пользовательский бегун, как показано ниже:

import org.junit.runners.BlockJUnit4ClassRunner; 
import org.junit.runners.model.InitializationError; 

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner { 

    public WeldJUnit4Runner(Class<Object> clazz) throws InitializationError { 
     super(clazz); 
    } 

    @Override 
    protected Object createTest() throws Exception { 
     final Class<?> test = getTestClass().getJavaClass(); 
     return WeldContext.INSTANCE.getBean(test); 
    } 

} 

А:

import org.jboss.weld.environment.se.Weld; 
import org.jboss.weld.environment.se.WeldContainer; 

public class WeldContext { 

    public static final WeldContext INSTANCE = new WeldContext(); 

    private final Weld weld; 
    private final WeldContainer container; 

    private WeldContext() { 
     this.weld = new Weld(); 
     this.container = weld.initialize(); 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       weld.shutdown(); 
      } 
     }); 
    } 

    public <T> T getBean(Class<T> type) { 
     return container.instance().select(type).get(); 
    } 

} 

Эти реализации были взяты из here.

Наконец, тест:

@RunWith(WeldJUnit4Runner.class) 
public class RuleMapperTest { 

    @Inject 
    private RuleMapper ruleMapper; 

    @Test 
    public void coolTestName() { 
     Assert.assertTrue(Boolean.TRUE); 
    } 
} 

Когда я пытаюсь запустить, это консольный вывод:

log4j: не WARN Нет appenders может быть найдено для регистратора (org.jboss.logging) , log4j: WARN Пожалуйста, правильно инициализируйте систему log4j. log4j: WARN См. http://logging.apache.org/log4j/1.2/faq.html#noconfig для получения дополнительной информации.

предупреждение о журналах, а также следующее исключение:

java.lang.ExceptionInInitializerError в br.com.treinoos.common.cdi.WeldJUnit4Runner.createTest (WeldJUnit4Runner.java:15) в орг .junit.runners.BlockJUnit4ClassRunner $ 1.runReflectiveCall (BlockJUnit4ClassRunner.java:266) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.BlockJUnit4ClassRunner.methodBlock (BlockJUnit4ClassRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit 4ClassRunner.java:78) на org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners .ParentRunner $ 1.schedule (ParentRunner.java:71) на org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) на org.junit.runners.ParentRunner $ 2.оценить (ParentRunner.java:268) на org.junit.runners.ParentRunner.run (ParentRunner.java:363) на org.eclipse.jdt.internal.junit4.runner. JUnit4TestReference.run (JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:192) Вызвано: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Невыполненные зависимости для типа RuleMapper с квалификаторами @Default при инъекции point [BackedAnnotatedField] @Inject private br.com.treinoos.model.core.business.treinoos.mappers.RuleMapperTest.ruleMapper на странице br.com.treinoos.model.core.business.treinoos.mappers.RuleMapperTest.ruleMapper (RuleMapperTest. java: 0) at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems (Validator.java:359) at org.jboss.weld.bootstrap.Validator.validateInjectionPoint (Validator.java:281) at org.jboss. weld.bootstrap.Validator.validateGeneralBean (Validator.java:134) на org.jboss.weld.bootstrap.Validator.valid ateRIBean (Validator.java:155) at org.jboss.weld.bootstrap.Validator.validateBean (Validator.java:518) at org.jboss.weld.bootstrap.ConcurrentValidator $ 1.doWork (ConcurrentValidator.java:68) на org.jboss.weld.bootstrap.ConcurrentValidator $ 1.doWork (ConcurrentValidator.java:66) at org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call (IterativeWorkerTaskFactory.java:63) at org.jboss.weld.executor .IterativeWorkerTaskFactory $ 1.call (IterativeWorkerTaskFactory.java:56) на java.util.concurrent.FutureTask.run (FutureTask.java:266) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) в java.la ng.Thread.run (Thread.java:745)

Как и Weld, не удалось найти сгенерированный класс. beans.xml уже создан под src/test/resources/META-INF/beans.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
        http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
    version="1.1" bean-discovery-mode="all"> 
</beans> 

Может кто-нибудь указать мне решение этой проблемы? Я уже искал что-то похожее, но ничего не добился.

+0

Вы добавили 'beans.xml' в' src/main/resources/META-INF'? –

+0

@Joh да, я сделал. –

+0

Это то же самое содержимое, что и в списке? Вы упомянули, что это явно 'src/test/resources' также обратите внимание на мой путь - его не' src/main/webapp' –

ответ

0

Вот полное объяснение вашей проблемы и почему то, что я написал, исправляет ее.

В Maven у вас есть как минимум 2 загрузчик классов. Ваш тестовый путь и ваш основной путь к классам имеют свой собственный загрузчик классов. Вы можете иметь других в зависимости от вашей структуры зависимостей. В этом случае CDI идентифицирует каждый загрузчик классов как отдельный бит. src/main/webapp явно предназначен для вашего файла WAR. beans.xml не дает вам архив бобов. Добавление одного к src/main/resources делает. Эта проблема специфична для того, как вы создаете сварку.

Есть и другие проекты, которые делают это правильно - CDI-unit и Arquillian, в частности, контейнер с встроенной сваркой. Если бы вы использовали один из них, это не было бы проблемой.

+0

Я использовал CDIUnit, я изменил, чтобы попытаться посмотреть, была ли проблема в lib. В любом случае, спасибо, это помогло мне. –