如何在Java 8和ModelMapper中使用显式映射?

2022-09-02 05:12:28

我通过官方文档学习如何使用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

enter image description here


答案 1

他们在此示例中遗漏了一个步骤,他们使用的方法是 from TypeMap,而不是 from 。您需要为 2 个对象定义 a。这边:addMappingsaddMappingsModelMapperTypeMap

// 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);
});

另一种方法是使用 中的方法。它不使用 lambdas,而是采用 PropertyMap。它也足够短:addMappingsModelMapper

ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(new PropertyMap<Order, OrderDTO>() {
  @Override
  protected void configure() {
    map().setBillingStreet(source.getBillingAddress().getStreet());
    map().setBillingCity(source.getBillingAddress().getCity());
  }
});

答案 2

如果源类型和目标类型不同。例如

@Entity
class Student {
    private Long id;
    
    @OneToOne
    @JoinColumn(name = "laptop_id")
    private Laptop laptop;
}

和 Dto ->

class StudentDto {
    private Long id;
    private LaptopDto laptopDto;
}

在这里,源类型和目标类型是不同的。因此,如果您的MingingStrategies是STRICTED的,您将无法在这两种不同类型的类型之间进行映射。现在要解决这个问题,只需将下面的代码放在控制器类的构造函数中,或者要使用 ModelMapper->

private ModelMapper modelMapper;

public StudentController(ModelMapper modelMapper) {
    this.modelMapper = modelMapper;
    this.modelMapper.typeMap(Student.class, StudentDto.class).addMapping(Student::getLaptop, StudentDto::setLaptopDto);
}
        

就是这样。现在,您可以轻松使用ModelMapper.map(源,目标)。它将自动映射

modelMapper.map(student, studentDto);

推荐