我正在尝试使用Orika在包含List<...>
的两个对象之间进行映射,其中List类型是另一个对象,但是尽管尝试mapperFactory.classMap(...)
中的映射配置的各种排列,Orika会抛出异常我运行我的程序。
查看http://orika-mapper.github.io/orika-docs/mappings-via-classmapbuilder.html似乎建议用于映射List
的语法应为parentProperty{childProperty}
。
出于这个问题的目的,我简化了我想要映射的对象。源对象为ToDoTaskListEntity
,目标对象为ToDoTaskListDTO
。源对象ToDoItemEntity
包含一个List,定义为List<ToDoItemEntity>
,目标对象包含一个相应的List,定义为List<ToDoItemDTO>
我的问题是如何在ToDoTaskListEntity
和ToDoTaskListDTO
之间定义Orika中的映射配置,以便子对象List<ToDoItemEntity>
也映射到{{ 1}}在各自的父对象中?
我的映射配置的代码如下:
List<ToDoItemDTO>
调用映射的代码如下:
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapperFactory.classMap(ToDoItemEntity.class, ToDoItemDTO.class)
.field("id", "id")
.field("description", "description")
.field("status", "status")
.byDefault()
.register();
mapperFactory.classMap(ToDoTaskListEntity.class, ToDoTaskListDTO.class)
.field("listName", "listName")
.field("toDoItems{id}", "toDoItems{id}")
.field("toDoItems{description}", "toDoItems{description}")
.field("toDoItems{status}", "toDoItems{status}")
.byDefault()
.register();
我的源对象的代码如下:
MapperFacade mapper = mapperFactory.getMapperFacade();
ToDoTaskListDTO toDoTaskListDTO = mapper.map(toDoTaskListEntity, ToDoTaskListDTO.class);
我的目标对象的代码如下:
public class ToDoTaskListEntity {
private String ListName;
private List<ToDoItemEntity> toDoItems;
// Getters and setters
}
public class ToDoItemEntity {
private int id;
private String description;
private Status status;
// Getters and setters
}
Orika抛出的例外情况如下:
public class ToDoTaskListDTO {
private String listName;
private List<ToDoItemDTO> toDoItems;
public ToDoTaskListDTO(String listName, List<ToDoItemDTO> toDoItems) {
this.listName = listName;
this.toDoItems = toDoItems;
}
//Getters but no setters
}
public class ToDoItemDTO {
private int id;
private String description;
private Status status;
public ToDoItemDTO(int id, String description, Status status) {
this.id = id;
this.description = description;
this.status = status;
}
// Getters but no setters
}
答案 0 :(得分:2)
我在Google网上论坛的Orika discussion group发布了相同的问题,并从Sidi Mohamed那里得到了以下答案,解决了我的问题。
此示例不需要任何特定映射,这是唯一的问题 我在这里看到的是DTO端的非默认构造函数
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); // item class map mapperFactory.classMap(ToDoItemEntity.class, ToDoItemDTO.class) .constrcutorB("id", "description", "status") .byDefault() .register(); mapperFactory.classMap(ToDoTaskListEntity.class, ToDoTaskListDTO.class) .constructorB("listName", "toDoItems") .byDefault() .register();
要回答您的问题,请使用类似toDoItems {id}的表达式 只是为了投射(或展平)你的对象,在这个例子中你是什么 想要重新使用以前的映射定义(例如,重用项目) 在第二类映射中映射到DoItems时的类映射)为什么 使用Orika:减少样板代码。