Technical note
研发规约-ModelMapper对像映射
简介
项目中经常需要将Model和DTO互转,产生很多getXXX/setXXX的模板化代码。使用ModelMapper可以简化转换步骤。
官网
添加依赖
<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();