Solución:
Perdieron un paso en este ejemplo, el addMappings
El método que utilizan es el addMappings
de TypeMap, no de ModelMapper
. Necesitas definir un TypeMap
para tus 2 objetos. De esta manera:
// 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);
});
Otra forma sería utilizar el addMappings
método de ModelMapper
. No usa lambdas y toma un PropertyMap. También es lo suficientemente corto:
ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(new PropertyMap<Order, OrderDTO>() {
@Override
protected void configure() {
map().setBillingStreet(source.getBillingAddress().getStreet());
map().setBillingCity(source.getBillingAddress().getCity());
}
});
si el tipo de origen y destino son diferentes. Por ejemplo,
@Entity
class Student {
private Long id;
@OneToOne
@JoinColumn(name = "laptop_id")
private Laptop laptop;
}
Y Dto ->
class StudentDto {
private Long id;
private LaptopDto laptopDto;
}
Aquí, los tipos de origen y destino son diferentes. Entonces, si sus MatchingStrategies son ESTRICTAS, no podrá mapear entre estos dos tipos diferentes. Ahora para resolver esto, simplemente coloque este código a continuación en el constructor de su clase de controlador o cualquier clase en la que desee usar ModelMapper->
private ModelMapper modelMapper;
public StudentController(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
this.modelMapper.typeMap(Student.class, StudentDto.class).addMapping(Student::getLaptop, StudentDto::setLaptopDto);
}
Eso es todo. Ahora puede usar ModelMapper.map (origen, destino) fácilmente. Se mapeará automáticamente
modelMapper.map(student, studentDto);