当使用“JSR330”componentModel使用MapStruct生成映射器实现时,micronaut将在运行时尝试注入这些实现时抛出一个NoSuchBeanException。
一个解决办法是使用提供程序来提供映射器对象,但生成的代码应该可以工作。
映射器定义:
@Mapper(componentModel = "jsr330")
public interface FooBarMapper {
Foo toFoo(Bar bar);
}
控制器:
@Controller
public class SomeController {
@Inject
public SomeController(FooBarMapper mapper) {
}
@Get
public String foo() {
return "foo";
}
}
pom.xml摘录:
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject-java</artifactId>
<version>${micronaut.version}</version>
</path>
<path>
<groupId>io.micronaut.configuration</groupId>
<artifactId>micronaut-openapi</artifactId>
<version>${micronaut.version}</version>
</path>
</annotationProcessorPaths>
当调用控制器上的方法时,我会期望Micronaut找到Mapstruct生成的类(它用@singleton注释),但相反,结果是
消息:不存在[com.example.foobarmapper]类型的bean。确保类声明为bean,如果您使用的是Java或Kotlin,请确保您启用了注释处理。采用的路径:新建SomeController([FooBarMapper mapper])IO.Micronaut.Context.Exceptions.DependencyInjectionException:无法为类:Com.Example.SomeController的参数[mapper]注入值
我找到了Micronaut PR,它应该可以解决mapstruct使用JSR330
组件模型的问题。他们计划在1.1.0
中包含该修复程序。
更新:如果在1.1.0.rc1
中修复了此问题
当我在中使用时,它会生成一个,我希望能够访问该文件以在单元测试中导入,但intellij看不到它
我试图修复Intellij和Mapstruct的一个问题。 之前我使用过Java8和Gradle4.6,并且Mapstruct运行良好。现在我已经将Java升级到11,Gradle升级到4.10.3。现在的问题是,在构建之后,当我运行应用程序时,我以unsatifiedDependencyException告终,因为某些映射器类不可用。我已经讨论了很多问题,其中大多数都建议将Intellij构建/
我需要在生成的mapper实现中注入一个spring服务类,以便通过 这是否适用于Mapstruct-1.0?
null 这是我运行单元测试时得到的跟踪: 我认为在我的pom.xml文件的build/plugin部分缺少或放错了地方 可以在这里查看项目的源代码: https://github.com/alfredux79/mapstruct-lombock-springboot/tree/stack-overflow-question
有没有一种方法可以忽略使用mapstruct在此代码示例中第三种方法的映射器的生成?
这个问题和这个问题完全相似。这个问题没有一个公认的答案,我已经尝试了这个问题中的所有建议,但它们都不起作用。我不想尝试这个答案,因为我觉得它违背了我使用不可变表的目的。@marc-von-renteln在这里的评论中很好地总结了这个原因 我尝试了@Tobias-Schulte提供的答案。但这引起了一个不同的问题。在答案中的Mapper类中,试图从映射方法返回Immutable*.builder时会