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

MapStruct在Micronaut中生成类的NoSuchBeanException

彭鸿文
2023-03-14

当使用“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]注入值

共有1个答案

阎德辉
2023-03-14

我找到了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时会