向MapStruct映射程序传递附加参数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (188)

还没有想出如何传递额外的参数或替代方法。

目前,我正在映射订单和订单行。这两个对象是不同的,需要@映射。例如,我有一个Order和OrderRequest对象,它们都是不同的,需要@映射注释来映射值,OrderLine也是如此。

我创建了以下映射器

  • OrderMapper(use=OrderLineMappers.class)
  • OrderLineMappers(use=OrderLineMapper.class)
  • OrderLineMapper

因此,我的问题是Orderline需要来自Order对象的OrderId。然而,在OrderLineMapper中,它传递的是命令行,而不是订单。如何将OrderId发送到OrderLineMapper?目前,我让OrderMapper做一个@AfterMapper,遍历orderline并填充OrderId。

@Mapper(componentModel = "spring",  uses = {OrderLineMappers.class})
public abstract class OrderMapper {

@AfterMapping
protected void orderRequestFromOrder( Order order, @MappingTarget 
OrderRequest orderRequest ) {

    //Wanting to do this at the OrderLineMapper class and not here
    String orderId = order.getId();
    List<OrderLineRequest> lines = orderRequest.getOrderLines();
    List<OrderLineRequest> updatedLines = new ArrayList<>();
    for (OrderLineRequest line : lines) {
        line.setOrderId(orderId);
        updatedLines.add(line);
    }
    orderRequest.setOrderLines(updatedLines);
}

@Mappings({
    @Mapping( source = "orderId", target = "id" ),
    @Mapping( source = "orderNumber", target = "order_number" ),
    @Mapping( source = "orderLines", target = "orderLines")
})
public abstract Order orderRequestToOrder(OrderRequest orderRequest);

类OrderLineMappers

@Mapper(componentModel = "spring",  uses = {OrderLineMapper.class})
public interface OrderLineMappers {

    List<OrderLine> orderLines(List<OrderLineRequest> orderLineRequest);

    @InheritInverseConfiguration
    List<OrderLineRequest> orderLineRequests(List<OrderLine> orderLine); 

}

类OrderLineMapper

@Mapper(componentModel = "spring")
public abstract class OrderLineMapper {
    @Mappings({
        @Mapping( target = "orderId", source = "orderLineId" ),
        @Mapping( target = "order_line_number", source = "orderLineNumber")

    })
    public abstract OrderLine orderLineRequestToOrderLine(OrderLineRequest orderLineRequest);
}

再次尝试将OrderId传递给OrderLineMapper。不知道该怎么做。

提问于
用户回答回答于

相反,可以使用@Context并在里面执行你的逻辑。你可以@AfterMapping@BeforeMapping在您的上下文中,可以在其中存储OrderID,并在其执行期间使用该ID。

所属标签

可能回答问题的人

  • EatRice

    16 粉丝0 提问138 回答
  • 学生

    8 粉丝476 提问522 回答
  • 富有想象力的人

    5 粉丝0 提问344 回答
  • 最爱开车啦

    9 粉丝503 提问1.6K 回答

扫码关注云+社区

领取腾讯云代金券