MapStruct 向 dto 添加一个新的计算字段
MapStruct add a new calculated field to the dto
我正在尝试使用 MapStruct 将实体 Order
映射到 OrderDTO
。我想向 OrderDTO
添加一个新字段 total
,该字段在原始实体 Order
中不可用,应使用 Order
中可用的信息进行计算(订单条目价格、数量、税...)。
我在 OrderDTO
中创建了一个新字段 total
并且我试图通过向映射器接口添加默认方法来映射它:
public interface OrderMapper {
...
default BigDecimal orderToTotal(Order order){
return logicToCalculateTotal();
}
}
当我午餐构建 MapStruct 时启动错误
Unmapped target property: "total".
知道如何解决这个问题吗?
谢谢
有多种方法可以满足您的需求。第一种方法是使用 @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();
}
}
如果使用DTO中的其他字段可以完全计算出计算字段:
我会将这些计算放入 getMethods - 无需添加冗余字段。 (考虑tight cohesion)
如果您将方法命名为 getTotal
,它将在 json/xml 中与所有其他字段一起显示为名称“总计”。
我正在尝试使用 MapStruct 将实体 Order
映射到 OrderDTO
。我想向 OrderDTO
添加一个新字段 total
,该字段在原始实体 Order
中不可用,应使用 Order
中可用的信息进行计算(订单条目价格、数量、税...)。
我在 OrderDTO
中创建了一个新字段 total
并且我试图通过向映射器接口添加默认方法来映射它:
public interface OrderMapper {
...
default BigDecimal orderToTotal(Order order){
return logicToCalculateTotal();
}
}
当我午餐构建 MapStruct 时启动错误
Unmapped target property: "total".
知道如何解决这个问题吗?
谢谢
有多种方法可以满足您的需求。第一种方法是使用 @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();
}
}
如果使用DTO中的其他字段可以完全计算出计算字段:
我会将这些计算放入 getMethods - 无需添加冗余字段。 (考虑tight cohesion)
如果您将方法命名为 getTotal
,它将在 json/xml 中与所有其他字段一起显示为名称“总计”。