Mapping 如何将自定义映射器与带有嵌套值和条件值的mapstruct一起使用

Mapping 如何将自定义映射器与带有嵌套值和条件值的mapstruct一起使用,mapping,mapstruct,Mapping,Mapstruct,我正在尝试使用mapstrut将一个对象映射到另一个对象,目前在某些情况下如何使用它面临一些挑战 public class TargetOrderDto { String id; String preferedItem; List<Item> items; String status; Address address; } public class Item { String id; String name; } public

我正在尝试使用mapstrut将一个对象映射到另一个对象,目前在某些情况下如何使用它面临一些挑战

public class TargetOrderDto {
    String id;
    String preferedItem;
    List<Item> items;
    String status;
    Address address;

}

public class Item {
  String id;
  String name;
}


public abstract class TargetOrderMapper {

  @Autowired
  private StatusRepository statusRepository;

  @Mappings({
      @Mapping(target = "id", source = "reference"),
      @Mapping(target = "preferedItem", source = ""), // Here I need to loop through these values checking for a single value with a specific tag
      @Mapping(target = "items", source = "items"),   // List of objects to another list of different data types. 
      @Mapping(target = "status", source = "remoteStatus") // may need to extract a value from a repository
  })
  abstract OrderDto toTargetOrderDto(RemoteOrder remoteOrder);

}

// Remote Data

public class RemoteOrder {
  String reference;
  List<Item> items;
  String remoteStatus;
}


public class RemoteItem {
  String id;
  String flag;
  String description;
}
公共类targetOrderTo{
字符串id;
字符串优先项;
清单项目;
字符串状态;
地址;
}
公共类项目{
字符串id;
字符串名;
}
公共抽象类TargetOrderMapper{
@自动连线
私有状态存储库状态存储库;
@映射({
@映射(target=“id”,source=“reference”),
@Mapping(target=“preferedItem”,source=“”),//这里我需要循环检查这些值,以检查具有特定标记的单个值
@映射(target=“items”,source=“items”),//对象列表到不同数据类型的另一个列表。
@映射(target=“status”,source=“remoteStatus”)//可能需要从存储库中提取值
})
向目标客户发送抽象订单(RemoteOrder RemoteOrder);
}
//远程数据
公共类远程命令{
字符串引用;
清单项目;
字符串远程状态;
}
公共类远程项{
字符串id;
字符串标志;
字符串描述;
}
这些都是当前我无法理解的场景(可能我正在映射一个复杂的对象)

  • 首选项项: 为此,我需要循环遍历订单中的项目,并使用特定标志标识该项目。(如果匹配,则取该值,否则使用null)
  • 项目: 我需要将其转换为两个不同列表的列表;从列表到列表,它们都有自己不同的映射规则
  • 远程状态: 这一个有点棘手,我需要从remoteOrder中提取状态,然后使用statusRepository在db中查找备用映射值

  • 非常感谢您的帮助

    不能使用MapStruct执行业务逻辑。所以,保持映射的简单性,并定义您自己的方法,以处理列表中的条件映射。注意:您可以编写自己的方法,MapStruct将选择它。此外,从这个自己的实现中,您可以再次引用MapStruct方法

    公共抽象类TargetOrderMapper{
    @自动连线
    私有状态存储库状态存储库;
    @映射({
    @映射(target=“id”,source=“reference”),
    @Mapping(target=“preferedItem”,source=“”),//这里我需要循环检查这些值,以检查具有特定标记的单个值
    @映射(target=“items”,source=“items”),//对象列表到不同数据类型的另一个列表。
    @映射(target=“status”,source=“remoteStatus”)//可能需要从存储库中提取值
    })
    向目标客户发送抽象订单(RemoteOrder RemoteOrder);
    受保护列表项列表(列表项){
    //你想干什么就干什么。。
    //并在迭代期间调用toItem。
    }
    受保护的抽象项到项(项);
    }
    
    地位也是如此。不久前,我添加了一个关于列表的内容(主要是关于更新,但我想这里也同样适用)


    关于查找,您可以使用
    @MappingContext
    传递包含访问数据库逻辑的上下文。请参见

    不能使用MapStruct执行业务逻辑。所以,保持映射的简单性,并定义您自己的方法,以处理列表中的条件映射。注意:您可以编写自己的方法,MapStruct将选择它。此外,从这个自己的实现中,您可以再次引用MapStruct方法

    公共抽象类TargetOrderMapper{
    @自动连线
    私有状态存储库状态存储库;
    @映射({
    @映射(target=“id”,source=“reference”),
    @Mapping(target=“preferedItem”,source=“”),//这里我需要循环检查这些值,以检查具有特定标记的单个值
    @映射(target=“items”,source=“items”),//对象列表到不同数据类型的另一个列表。
    @映射(target=“status”,source=“remoteStatus”)//可能需要从存储库中提取值
    })
    向目标客户发送抽象订单(RemoteOrder RemoteOrder);
    受保护列表项列表(列表项){
    //你想干什么就干什么。。
    //并在迭代期间调用toItem。
    }
    受保护的抽象项到项(项);
    }
    
    地位也是如此。不久前,我添加了一个关于列表的内容(主要是关于更新,但我想这里也同样适用)


    关于查找,您可以使用
    @MappingContext
    传递包含访问数据库逻辑的上下文。见

    @Gunnar,你能帮忙吗help@Gunnar谢谢@Sjaak的帮助,对不起,我对mapstruct有个不成熟的想法。长寿谢谢@Sjaak的帮助,很抱歉我对mapstruct有个不成熟的想法。万岁