【问题标题】:Mapper decorator not getting compiled映射器装饰器未编译
【发布时间】:2019-05-07 01:15:08
【问题描述】:

我的映射器的映射器装饰器没有被编译。映射器正在编译,但不是装饰器。因为,在构建过程中,我遇到了类型转换错误,即使我是在映射器装饰器中进行的。还有什么要补充的吗?

映射器代码:

 @Mapper
    @DecoratedWith(OneMapperDecorator.class)

    public interface OneMapper {
     public TwoObject convertToTwoObject(OneObject one);
    }

装饰器代码:

     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;
            }
}

【问题讨论】:

  • 还有什么要补充的,你得到的实际异常可能会有所帮助
  • 无法将属性“java.lang.String price”映射到“java.math.BigDecimal fare”。考虑声明/实现一个映射方法:“java.math.BigDecimal map(java.lang.String value)”。这是@Eugene 的错误
  • 嗯,这和你说的有点不同:我的映射器的映射器装饰器没有被编译?你明白现在完全不同了吗?
  • 我在装饰器@Eugene中实现了类型转换方法...那为什么会报错??

标签: spring-mvc java-8 mapstruct


【解决方案1】:

装饰器旨在增强映射而不是替换它。 MapStruct 无法知道您正在将 totalFare 映射到装饰器中。你有两个选择:

定义自定义映射方法

在您的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);
    }

}

忽略映射

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

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

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

}

如果您仅使用委托来映射额外字段,我会建议您添加自定义方法或使用 @AfterMapping@BeforeMapping 来处理。

【讨论】:

  • 谢谢。您的解决方案非常完美。实际上,我有另一个名称相同但数据类型不同的字段……还需要将字符串转换为 Bigdecimal。但由于该字段在两个 bean 类中具有相同的名称......映射发生在映射器本身......它没有进入装饰器......这就是我收到编译错误的原因。所以我添加了你提到的ignore='true'。
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 2017-05-02
  • 2010-11-13
  • 2014-06-17
  • 2016-04-27
  • 2012-02-03
  • 2021-01-28
  • 2015-08-19
相关资源
最近更新 更多