使用Orika在包含List的两个对象之间进行映射

时间:2015-04-07 10:15:34

标签: java list mapping orika

我正在尝试使用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>

我的问题是如何在ToDoTaskListEntityToDoTaskListDTO之间定义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
}

1 个答案:

答案 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:减少样板代码。