我正在尝试使用MapStruct将实体Order
映射到OrderDTO
。我想在OrderDTO
添加新字段total
,此字段在原始实体Order
中不可用,应使用Order
中提供的信息进行计算(订单条目价格,数量,税收......)。
我在total
中创建了一个新字段OrderDTO
,我试图通过向映射器界面添加默认方法来映射它:
public interface OrderMapper {
...
default BigDecimal orderToTotal(Order order){
return logicToCalculateTotal();
}
}
当我午餐时,构建MapStruct会启动错误
未映射的目标属性:“total”。
知道如何解决这个问题吗?
由于
答案 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”。