Technical note

研发规约-ModelMapper对像映射

简介

项目中经常需要将Model和DTO互转,产生很多getXXX/setXXX的模板化代码。使用ModelMapper可以简化转换步骤。

官网

http://modelmapper.org/

添加依赖

<dependency>
  <groupId>org.modelmapper</groupId>
  <artifactId>modelmapper</artifactId>
  <version>2.3.0</version>
</dependency>

对象示例

源对象:

// Assume getters and setters on each class
class Order {
  Customer customer;
  Address billingAddress;
}

class Customer {
  Name name;
}

class Name {
  String firstName;
  String lastName;
}

class Address {
  String street;
  String city;
}

目标对象:

// Assume getters and setters
class OrderDTO {
  String customerFirstName;
  String customerLastName;
  String billingStreet;
  String billingCity;
}

自动转换

ModelMapper modelMapper = new ModelMapper();
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);

自定义转换

modelMapper.typeMap(Order.class, OrderDTO.class).addMappings(mapper -> {
  mapper.map(src -> src.getBillingAddress().getStreet(),
      Destination::setBillingStreet);
  mapper.map(src -> src.getBillingAddress().getCity(),
      Destination::setBillingCity);
});

转换配置

ModelMapper有Standard、Loose、Strict 3种模式:

modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);

参考文档: http://modelmapper.org/user-manual/configuration/#matching-strategies

转换校验

assert手工校验:

assertEquals(order.getCustomer().getName().getFirstName(), orderDTO.getCustomerFirstName());

ModelMapper自动校验:

modelMapper.createTypeMap(Order.class, OrderDTO.class);
modelMapper.addMappings(new OrderMap());
modelMapper.validate();