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 中与所有其他字段一起显示为名称“总计”。