当使用“ 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,请确保已启用注释处理。
采取的路径:new SomeController([FooBarMapper mapper])
io.micronaut.context.exceptions.DependencyInjectionException:无法为类com.example.SomeController的参数[mapper]注入值

最佳答案

我发现Micronaut PR应该可以使用jsr330组件模型解决mapstruct的问题。他们计划将修复程序包含在1.1.0中。

更新:如果在1.1.0.RC1中已解决问题

关于java - 在Micronaut中MapStruct生成的类的NoSuchBeanException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54136772/

10-10 20:16