MapStruct将新的计算字段添加到dto

时间:2017-08-04 07:34:20

标签: spring-boot java-8 mapstruct

我正在尝试使用MapStruct将实体Order映射到OrderDTO。我想在OrderDTO添加新字段total,此字段在原始实体Order中不可用,应使用Order中提供的信息进行计算(订单条目价格,数量,税收......)。 我在total中创建了一个新字段OrderDTO,我试图通过向映射器界面添加默认方法来映射它:

public interface OrderMapper {

    ...

    default BigDecimal orderToTotal(Order order){
        return logicToCalculateTotal();
    }
}

当我午餐时,构建MapStruct会启动错误

  

未映射的目标属性:“total”。

知道如何解决这个问题吗?

由于

2 个答案:

答案 0 :(得分:7)

有多种方法可以实现您的需求。第一种方法是使用@AfterMapping@BeforeMapping。如果您使用此代码,您的代码将如下所示:

public interface OrderMapper {

    @Mapping(target = "total", ignore = true) // Needed so the warning does not shown, it is mapped in calculateTotal
    OrderDto map(Order order);

    @AfterMapping // or @BeforeMapping
    default void calculateTotal(Order order, @MappingTarget OrderDto dto) {
        dto.setTotal(logicToCalculateTotal());
    }
}

另一种方法是像你开始那样做,但你必须说total是从Order映射的。

替代方法中的映射器将是:

public interface OrderMapper {

    @Mapping(target = "total", source = "order")// the source should be equal to the property name
    OrderDto map(Order order);

    default BigDecimal orderToTotal(Order order) {
        return logicToCalculateTotal();
    }
}

答案 1 :(得分:0)

如果可以使用DTO中的其他字段完全计算出计算所得的字段:

我会将这些计算结果放入getMethods中-无需添加冗余字段。 (关于tight cohesion的思考)

如果您将方法命名为getTotal,它将在json / xml中以除其他所有字段外的名称显示为“ total”。