【发布时间】:2021-08-23 05:35:55
【问题描述】:
我有一个带有两个转换器的 springboot 应用程序,它们可以从 A 类转换为 B 类。 B 正在扩展 A。
当我调用转换服务时,总是调用 A。
我希望转换服务通过 A 调用 B。 我尝试了@Order 和@Primary,但都没有奏效。
有没有办法定义优先级?
-- 编辑
我正在使用 Springboot + Mapstruct + https://github.com/mapstruct/mapstruct-spring-extensions
它生成CarMapperImpl(实现Converter),我像这样扩展它:
@Component
public class CarMapperImplExtended extends CarMapperImpl {
public CarMapperImplExtended(ConversionServiceAdapter conversionServiceAdapter) {
super(conversionServiceAdapter);
}
@Override
public CarDto convert(Car car) {
CarDto carDto = super.convert(car);
// do something special with it
return carDto;
}
}
代码已生成,这就是为什么我最终会得到两个实现 Converter<Car, CarDto> 的 bean。
理想情况下,我不会有 CarMapperImpl - 是的 - 但我找不到另一种使用 mapstruct-extension 并覆盖转换或从生成的代码中删除 @Component 的方法。
最后,我找到了一种解决方法:如果有两个转换器实现Converter<A,B>,ConversionService 将使用添加的一个最后一个。
如果CarMapperImplA 和CarMapperImplB 存在,将使用CarMapperImplB。
【问题讨论】:
-
你能分享你的实现吗?
-
通常,您会希望阻止
A的 bean 在上下文中注册。 -
如果问题是依赖注入的顺序,@Qualifer 可能会有所帮助。
-
我试过@Primary,但这没有帮助。我必须查看 spring 代码,但看起来最后加载的转换器替换了现有的。
标签: java spring spring-boot