2016-12-20 28 views
0

我有一个maven项目,我使用MapStruct生成映射器以帮助将实体转换为DTO,反之亦然。 这个映射器是在maven的generate-sources阶段生成的,并存储在target/generated-sources和target/AppName/WEB-INF/classes文件夹中。如何在生成的源代码上生成焊接查找类

例如,我有这样的映射

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

Wildfly服务器上运行时,它的工作原理perfectely,问题是我正在努力测试这个班级,为此,我实施了一个自定义亚军,如下所示:

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:警告没有附加目的地可以发现记录器(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) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58) 在org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at 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) 。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 at br.com.treinoos.model.core.business.treinoos.mappers.RuleMapperTest.ruleMapper(RuleMapperTest。的java:0) 在org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359) 在org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281) 在org.jboss。 weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) at org.jboss.weld.bootstrap.Validator.valid在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) at 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> 

任何人都可以点我解决这个问题呢?我已经搜索了一些simillar,但没有成功。

+0

你还给'src/main/resources/META-INF'添加了一个'beans.xml'吗? –

+0

@Joh是的,我做到了。 –

+0

与列出的内容完全相同吗?你提到这一个明确'src /测试/资源'也请注意我的路径 - 它不是'src/main/webapp' –

回答

0

下面是对您的问题的完整说明,以及为什么我写的修复了它。

在Maven中,您至少有2个类加载器。你的测试类路径和主类路径都有自己的类加载器。您可以根据您的依赖性结构获得其他人。当以这种方式运行时,CDI将每个类加载器标识为单独的bean存档。 src/main/webapp明确用于您的WAR文件。那里的beans.xml没有给你一个bean档案。添加一个到src/main/resources呢。这个问题特定于你如何实例化焊接。

还有其他项目正确地做到这一点 - CDI-unitArquillian,特别是Weld Embedded容器。如果你使用其中之一,这不会是一个问题。

+0

我用CDIUnit,我改变尝试看看问题是否是lib。无论如何,谢谢,这帮助了我。 –