当前位置: 首页 > 知识库问答 >
问题:

如何在生成的源上创建Weld lookup类

咸承教
2023-03-14

我有一个maven项目,我使用MapSTRt来生成映射器,以帮助将实体转换为DTO,反之亦然。这个映射器是在maven的生成源阶段生成的,并存储到目标/生成源和目标/AppName/WEB-INF/类文件夹中。

例如,我有一个映射器

@Mapper
public interface RuleMapper {

    RuleDto ruletoDto(Rule rule);

    //other cool stuf
}

我配置了MapSTRt以使用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服务器上运行时工作得非常完美,问题是我正在尝试junit测试这个类,为此,我实现了一个定制的运行程序,如下所示:

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();
    }

}

这些实现取自这里。

最后,测试:

@RunWith(WeldJUnit4Runner.class)
public class RuleMapperTest {

    @Inject
    private RuleMapper ruleMapper;

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

当我尝试运行时,这是控制台输出:

log4j: WARN无法找到记录器(org.jboss.logging)的附加程序。log4j: WARN请正确初始化log4j系统。log4j: WARN见http://logging.apache.org/log4j/1.2/faq.html#noconfig了解更多信息。

关于日志和以下异常的警告:

JAVAlang.exceptionininitializerror在br。通用域名格式。特雷诺斯。常见的cdi。焊接工是一名跑步者。在org上创建测试(WeldJUnit4Runner.java:15)。朱尼特。跑步者。BlockJunit4 ClassRunner 1美元。org上的runReflectCall(BlockJUnit4ClassRunner.java:266)。朱尼特。内部的跑步者。模型可反射的。在org上运行(reflectVeCallable.java:12)。朱尼特。跑步者。BlockJunitClassRunner。methodBlock(BlockJUnit4ClassRunner.java:263)位于org。朱尼特。跑步者。BlockJunitClassRunner。org上的runChild(BlockJUnit4ClassRunner.java:78)。朱尼特。跑步者。BlockJunitClassRunner。org上的runChild(BlockJUnit4ClassRunner.java:57)。朱尼特。跑步者。ParentRunner 3美元。在org上运行(ParentRunner.java:290)。朱尼特。跑步者。ParentRunner 1美元。日程安排(ParentRunner.java:71)在org上。朱尼特。跑步者。家长跑步者。runChildren(ParentRunner.java:288)在org上。朱尼特。跑步者。家长跑步者。访问org上的$000(ParentRunner.java:58)。朱尼特。跑步者。ParentRunner 2美元。在org上评估(ParentRunner.java:268)。朱尼特。跑步者。家长跑步者。在org上运行(ParentRunner.java:363)。日食jdt。内部的junit4。跑步者JUnit4TestReference。在org上运行(JUnit4TestReference.java:86)。日食jdt。内部的朱尼特。跑步者测试执行。在org上运行(TestExecution.java:38)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。org上的runTests(RemoteTestRunner.java:459)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。org上的runTests(RemoteTestRunner.java:675)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行(RemoteTestRunner.java:382)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。main(RemoteTestRunner.java:192)由:org引起。jboss。焊接例外。DeploymentException:WELD-001408:注入点处带有限定符@Default[BackedAnnotatedField]@Inject private br的类型规则映射器的依赖关系未得到满足。通用域名格式。特雷诺斯。模型果心商业特雷诺斯。地图绘制员。规则映射测试。br的规则映射程序。通用域名格式。特雷诺斯。模型果心商业特雷诺斯。地图绘制员。规则映射测试。org上的ruleMapper(RuleMapperTest.java:0)。jboss。焊接独自创立验证器。validateInjectionPointForDeploymentProblems(Validator.java:359)位于org。jboss。焊接独自创立验证器。validateInjectionPoint(Validator.java:281)位于org。jboss。焊接独自创立验证器。validateGeneralBean(Validator.java:134)位于org。jboss。焊接独自创立验证器。validateRIBean(Validator.java:155)位于org。jboss。焊接独自创立验证器。validateBean(Validator.java:518)位于org。jboss。焊接独自创立ConcurrentValidator 1美元。doWork(ConcurrentValidator.java:68)位于org。jboss。焊接独自创立ConcurrentValidator 1美元。doWork(ConcurrentValidator.java:66)位于org。jboss。焊接遗嘱执行人。IterativeWorkerTaskFactory$1。在org上调用(IterativeWorkerTaskFactory.java:63)。jboss。焊接遗嘱执行人。IterativeWorkerTaskFactory$1。在java上调用(IterativeWorkerTaskFactory.java:56)。util。同时发生的未来任务。在java上运行(FutureTask.java:266)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)。util。同时发生的ThreadPoolExecutor$Worker。在java上运行(ThreadPoolExecutor.java:617)。朗。丝线。运行(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>

有人能给我指出这个问题的解决办法吗?我已经搜索过类似的东西,但没有成功。

共有1个答案

韦繁
2023-03-14

以下是对你的问题的完整解释,以及为什么我写的东西能解决这个问题。

在Maven中,至少有2个类加载器。测试类路径和主类路径都有自己的类加载器。根据您的依赖关系结构,您可以有其他依赖关系。当以这种方式运行时,CDI将每个类加载器标识为一个单独的bean归档src/main/webapp明确用于WAR文件。bean。xml没有提供bean存档。将一个添加到src/main/resources。这个问题与您如何实例化weld有关。

还有其他项目可以正确地做到这一点——CDI单元和Arquillian,特别是焊接嵌入式容器。如果你使用其中一个,这将不是一个问题。

 类似资料:
  • 我需要遍历一个形状像树的API。例如,目录结构或讨论线程。它可以通过以下流程进行建模: 如何遍历这些数据?我的工作如下: 然而,由于我使用的是带有缓冲区的流,所以流永远不会完成。 上游完成且缓冲元件已排空时完成 流缓冲器 我多次阅读了图表周期、活跃度和死锁部分,但仍在努力寻找答案。 这将创建一个活动锁: 编辑:我添加了一个git repo来测试你的解决方案https://github.com/Ma

  • 在Java中,可以使用轻松地生成无限流。但是,我需要生成一个最终完成的流。 想象一下,例如,我想要一个目录中所有文件的流。文件的数量可能很大,因此我无法预先收集所有数据并从中创建流(通过)。我需要一段一段地生成序列。但是流显然会在某个时候完成,而像(或)这样的终端操作符需要对其进行操作,因此在这里不合适。 有没有什么合理的简单方法可以在Java中做到这一点,而不用我自己实现整个流接口呢? 我可以想

  • 我想创建一个SpringBoot胖JAR,其中包含来自目标/生成源的类。之后,我想在另一个应用程序中添加这个JAR作为依赖项,并在另一个应用程序中使用来自目标/生成源的类。 所以我有一个Spring Boot应用程序,在之后,一些类正在生成,因为我使用Swagger codemen插件。经过几个小时的搜索,如何创建一个包含src/main/java中所有类的Spring Boot脂肪JAR,因为您

  • 我想像这样用resideMenu创建一个应用程序。怎么做?或者有什么有用的库可以帮助实现它?谢谢!

  • 我正在使用maven jaxws插件从我的wsdl模式生成java类。它没有在生成的类中生成@XmlElementWrapper注释。从这篇文章中,我了解到我需要使用jaxb xew插件,但我无法让它与maven jaxws插件一起工作。任何帮助都将不胜感激。这是我试过的配置 如果它只能与maven-jaxb2-plugin集成,你能帮我升级我的Web服务吗?本质上,我该如何指定wsdl以及如何生

  • 我为我的系统创建了一些报告,该报告由许多表组成。为此,我创建了一个带有@Entity注释的域类,并实现了一个JpaRepository存储库,我将本机查询与@query一起使用,如下所示。 我的问题是,对于每个域类,hibernate都在创建一个表,如何停止它? 我的域类: 我的存储库: