映射器装饰器未编译

asw*_*thy 2 spring-mvc java-8 mapstruct

我的映射器的映射器装饰器未编译。映射器正在编译,但装饰器未编译。因为,在构建过程中,即使我在映射器装饰器中执行此操作,我也会遇到类型转换错误。还有什么要补充的吗?

映射器代码:

 @Mapper
    @DecoratedWith(OneMapperDecorator.class)

    public interface OneMapper {
     public TwoObject convertToTwoObject(OneObject one);
    }
Run Code Online (Sandbox Code Playgroud)

装饰器代码:

     public abstract class OneMapperDecorator implements OneMapper {

            private final OneMapper delegate;

            public OneMapperDecorator (OneMapper delegate) {
                this.delegate = delegate;
            }
            @Override
            public TwoObject convertToTwoObject(OneObject one)
            {
                TwoObject two=delegate.convertToTwoObject(one);

                two.setTotalFare(new BigDecimal(one.getPrice()));//string to bigdecimal conversion
                return two;
            }
}
Run Code Online (Sandbox Code Playgroud)

Fil*_*lip 5

装饰器的目的是增强映射而不是取代它。MapStruct 无法知道您正在totalFare装饰器中映射您的对象。您有 2 个选择:

定义自定义映射方法

在您的文件中,OneMapper您可以添加一个默认方法来执行映射(如错误所示)。

@Mapper
@DecoratedWith(OneMapperDecorator.class)
public interface OneMapper {

    @Mapping(target = "totalFare", source = "price");
    TwoObject convertToTwoObject(OneObject one);

    default BigDecimal map(String value) {
        return value == null ? null : new BigDecimal(value);
    }

}
Run Code Online (Sandbox Code Playgroud)

忽略映射

如果您想在装饰器中进行映射,那么您需要告诉 MapStruct 不要映射它。

@Mapper
@DecoratedWith(OneMapperDecorator.class)
public interface OneMapper {

    @Mapping(target = "totalFare", ignore = true);
    TwoObject convertToTwoObject(OneObject one);

}
Run Code Online (Sandbox Code Playgroud)

我的一个建议是,如果您仅使用委托来映射额外的字段,我会添加自定义方法或使用@AfterMappingand@BeforeMapping来处理该问题。