【问题标题】:Passing additional parameters to MapStruct mapper将附加参数传递给 MapStruct 映射器
【发布时间】:2018-11-04 04:15:33
【问题描述】:

还没有弄清楚如何传递额外的参数或替代方法。

目前我正在映射 Order 和 OrderLines。两个对象不同,需要@mappings。示例我有一个 Order 和 OrderRequest 对象,它们都是不同的,需要 @Mappings 注释来映射值,与 OrderLines 相同。

我创建了以下映射器

  • OrderMapper(使用 = OrderLineMappers.class)
  • OrderLineMappers(使用 = OrderLineMapper.class)
  • OrderLineMapper

所以我的问题是 OrderLine 需要 Order 对象中的 OrderId。但是在 OrderLineMapper 中,它传递的是 OrderLine 而不是 Order。如何将 OrderId 发送到 OrderLineMapper?目前,我让 OrderMapper 执行 @AfterMapper,循环遍历 orderLines 并填充 OrderId。

任何帮助都会很棒。

类 OrderMapper

@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。不知道该怎么做。

【问题讨论】:

    标签: java mapping mapstruct


    【解决方案1】:

    你真的不能这样做。您可以做的是使用@Context 并在其中执行您的逻辑。您可以在上下文中使用@AfterMapping@BeforeMapping,您可以在其中存储Order id 并在执行期间使用它

    例如

    public class OrderMappingContext {
    
        protected String currentOrderId;
    
        @BeforeMapping
        public void startMappingOrder(@MappingTarget Order order, OrderRequest request) {
            this.currentOrderId = request.getId();
        }
    
        @AfterMapping
        public void finishOrderMapping(@MappingTarget Order order) {
            this.currentOrderId = null;
        }
    
        @AfterMapping
        public void afterOrderLineMapping(@MappingTarget OrderLine orderLine) {
            orderLine.setOrderId(this.currentOrderId);
        }
    }
    

    您的映射器将如下所示:

    @Mapper(componentModel = "spring",  uses = {OrderLineMappers.class})
    public abstract class OrderMapper {
    
    
    
        @Mapping( source = "orderId", target = "id" ),
        @Mapping( source = "orderNumber", target = "order_number" ),
        @Mapping( source = "orderLines", target = "orderLines")
        public abstract Order orderRequestToOrder(OrderRequest orderRequest, @Context OrderMappingContext context);
    
    @Mapper(componentModel = "spring",  uses = {OrderLineMapper.class})
    public interface OrderLineMappers {
    
        List<OrderLine> orderLines(List<OrderLineRequest> orderLineRequest, @Context OrderMappingContext context);
    
        @InheritInverseConfiguration
        List<OrderLineRequest> orderLineRequests(List<OrderLine> orderLine); 
    
    }
    
    @Mapper(componentModel = "spring")
    public abstract class OrderLineMapper {
    
        @Mapping( target = "orderId", source = "orderLineId" ),
        @Mapping( target = "order_line_number", source = "orderLineNumber")
        public abstract OrderLine orderLineRequestToOrderLine(OrderLineRequest orderLineRequest, @Context OrderMappingContext context);
    }
    

    在调用方面,您将执行类似的操作

    orderMapper.orderRequestToOrder(request, new OrderMappingContext());
    

    【讨论】:

    • 举个例子真的很有用
    • 我添加了一个展示这个想法的示例
    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 2022-11-23
    • 2011-12-21
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多