【问题标题】:Spring converter priority弹簧转换器优先级
【发布时间】: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

以我为例:https://github.com/mapstruct/mapstruct-spring-extensions/tree/main/examples/custom-conversion-service-bean/src/main/java/org/mapstruct/extensions/spring/example/custombean

它生成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 将使用添加的一个最后一个

如果CarMapperImplACarMapperImplB 存在,将使用CarMapperImplB

【问题讨论】:

  • 你能分享你的实现吗?
  • 通常,您会希望阻止 A 的 bean 在上下文中注册。
  • 如果问题是依赖注入的顺序,@Qualifer 可能会有所帮助。
  • 我试过@Primary,但这没有帮助。我必须查看 spring 代码,但看起来最后加载的转换器替换了现有的。

标签: java spring spring-boot


【解决方案1】:

使用带有弹簧组件模型的@DecoratedWith 已解决,如下所述:

https://mapstruct.org/documentation/stable/reference/html/#customizing-mappers-using-decorators

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多