У меня есть проект 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>
Может кто-нибудь указать мне решение этой проблемы? Я уже искал что-то похожее, но ничего не добился.
Вы добавили 'beans.xml' в' src/main/resources/META-INF'? –
@Joh да, я сделал. –
Это то же самое содержимое, что и в списке? Вы упомянули, что это явно 'src/test/resources' также обратите внимание на мой путь - его не' src/main/webapp' –