如何使用 Java 8 和 ModelMapper 的 Explicit Map?
How to use Explicit Map with Java 8 and ModelMapper?
通过官方文档学习ModelMapper的使用方法http://modelmapper.org/getting-started/
有使用 java 8
显式映射的代码示例
modelMapper.addMappings(mapper -> {
mapper.map(src -> src.getBillingAddress().getStreet(),
Destination::setBillingStreet);
mapper.map(src -> src.getBillingAddress().getCity(),
Destination::setBillingCity);
});
如何正确使用此代码?当我在 IDE 中键入此代码片段时,IDE 显示消息 cannot resolve method map
他们错过了这个例子中的一个步骤,他们使用的 addMappings
方法是来自 TypeMap 的 addMappings
,而不是来自 ModelMapper
。您需要为您的 2 个对象定义一个 TypeMap
。这样:
// Create your mapper
ModelMapper modelMapper = new ModelMapper();
// Create a TypeMap for your mapping
TypeMap<Order, OrderDTO> typeMap =
modelMapper.createTypeMap(Order.class, OrderDTO.class);
// Define the mappings on the type map
typeMap.addMappings(mapper -> {
mapper.map(src -> src.getBillingAddress().getStreet(),
OrderDTO::setBillingStreet);
mapper.map(src -> src.getBillingAddress().getCity(),
OrderDTO::setBillingCity);
});
另一种方法是使用 ModelMapper
中的 addMappings
方法。它不使用 lambda 并采用 PropertyMap。也够短了:
ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(new PropertyMap<Order, OrderDTO>() {
@Override
protected void configure() {
map().setBillingStreet(source.getBillingAddress().getStreet());
map().setBillingCity(source.getBillingAddress().getCity());
}
});
如果源和目标类型不同。例如,
@Entity
class Student {
private Long id;
@OneToOne
@JoinColumn(name = "laptop_id")
private Laptop laptop;
}
和 Dto ->
class StudentDto {
private Long id;
private LaptopDto laptopDto;
}
此处,源和目标类型不同。因此,如果您的 MatchingStrategies 是严格的,您将无法在这两种不同类型之间进行映射。
现在要解决这个问题,只需将下面的代码放在控制器的构造函数中 class 或任何要使用 ModelMapper->
的 class
private ModelMapper modelMapper;
public StudentController(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
this.modelMapper.typeMap(Student.class, StudentDto.class).addMapping(Student::getLaptop, StudentDto::setLaptopDto);
}
就是这样。现在您可以轻松使用 ModelMapper.map(source, destination) 了。它会自动映射
modelMapper.map(student, studentDto);
通过官方文档学习ModelMapper的使用方法http://modelmapper.org/getting-started/
有使用 java 8
显式映射的代码示例modelMapper.addMappings(mapper -> {
mapper.map(src -> src.getBillingAddress().getStreet(),
Destination::setBillingStreet);
mapper.map(src -> src.getBillingAddress().getCity(),
Destination::setBillingCity);
});
如何正确使用此代码?当我在 IDE 中键入此代码片段时,IDE 显示消息 cannot resolve method map
他们错过了这个例子中的一个步骤,他们使用的 addMappings
方法是来自 TypeMap 的 addMappings
,而不是来自 ModelMapper
。您需要为您的 2 个对象定义一个 TypeMap
。这样:
// Create your mapper
ModelMapper modelMapper = new ModelMapper();
// Create a TypeMap for your mapping
TypeMap<Order, OrderDTO> typeMap =
modelMapper.createTypeMap(Order.class, OrderDTO.class);
// Define the mappings on the type map
typeMap.addMappings(mapper -> {
mapper.map(src -> src.getBillingAddress().getStreet(),
OrderDTO::setBillingStreet);
mapper.map(src -> src.getBillingAddress().getCity(),
OrderDTO::setBillingCity);
});
另一种方法是使用 ModelMapper
中的 addMappings
方法。它不使用 lambda 并采用 PropertyMap。也够短了:
ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(new PropertyMap<Order, OrderDTO>() {
@Override
protected void configure() {
map().setBillingStreet(source.getBillingAddress().getStreet());
map().setBillingCity(source.getBillingAddress().getCity());
}
});
如果源和目标类型不同。例如,
@Entity
class Student {
private Long id;
@OneToOne
@JoinColumn(name = "laptop_id")
private Laptop laptop;
}
和 Dto ->
class StudentDto {
private Long id;
private LaptopDto laptopDto;
}
此处,源和目标类型不同。因此,如果您的 MatchingStrategies 是严格的,您将无法在这两种不同类型之间进行映射。 现在要解决这个问题,只需将下面的代码放在控制器的构造函数中 class 或任何要使用 ModelMapper->
的 classprivate ModelMapper modelMapper;
public StudentController(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
this.modelMapper.typeMap(Student.class, StudentDto.class).addMapping(Student::getLaptop, StudentDto::setLaptopDto);
}
就是这样。现在您可以轻松使用 ModelMapper.map(source, destination) 了。它会自动映射
modelMapper.map(student, studentDto);