MapStruct 的 NoSuchBeanException 在 Micronaut 中生成 类
NoSuchBeanException for MapStruct generated classes in Micronaut
当使用 MapStruct 生成映射器实现时,使用 "jsr330" componentModel,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 class(用 @Singleton 注释),但结果是
消息:[com.example.FooBarMapper] 类型的 bean 不存在。确保 class 被声明为一个 bean,如果您使用的是 Java 或 Kotlin,请确保您已启用注解处理。
采用的路径:new SomeController([FooBarMapper mapper])
io.micronaut.context.exceptions.DependencyInjectionException:无法为 class 的参数 [mapper] 注入值:com.example.SomeController
我发现 Micronaut PR 应该可以解决使用 jsr330
组件模型的 mapstruct 问题。他们计划在 1.1.0
.
中包含此修复程序
更新:问题已在 1.1.0.RC1
中修复
当使用 MapStruct 生成映射器实现时,使用 "jsr330" componentModel,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 class(用 @Singleton 注释),但结果是
消息:[com.example.FooBarMapper] 类型的 bean 不存在。确保 class 被声明为一个 bean,如果您使用的是 Java 或 Kotlin,请确保您已启用注解处理。 采用的路径:new SomeController([FooBarMapper mapper]) io.micronaut.context.exceptions.DependencyInjectionException:无法为 class 的参数 [mapper] 注入值:com.example.SomeController
我发现 Micronaut PR 应该可以解决使用 jsr330
组件模型的 mapstruct 问题。他们计划在 1.1.0
.
更新:问题已在 1.1.0.RC1