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

如何在Java8和ModelMapper中使用显式映射?,java,java-8,modelmapper,Java,Java 8,Modelmapper,我通过官方文档学习如何使用ModelMapper 有一个使用Java8进行显式映射的代码示例 modelMapper.addMappings(mapper -> { mapper.map(src -> src.getBillingAddress().getStreet(), Destination::setBillingStreet); mapper.map(src -> src.getBillingAddress().getCity(), De

我通过官方文档学习如何使用ModelMapper

有一个使用Java8进行显式映射的代码示例

modelMapper.addMappings(mapper -> {
  mapper.map(src -> src.getBillingAddress().getStreet(),
      Destination::setBillingStreet);
  mapper.map(src -> src.getBillingAddress().getCity(),
      Destination::setBillingCity);
});
如何正确使用此代码?当我在IDE中键入此代码段时,IDE向我显示消息
无法解析方法映射


他们错过了本例中的一个步骤,他们使用的
addMappings
方法是来自的
addMappings
,而不是来自
ModelMapper
。您需要为两个对象定义一个
类型映射。这样:

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

如果源和目标类型不同。比如说,

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

class StudentDto {
    private Long id;
    private LaptopDto laptopDto;
}
在这里,源和目标类型是不同的。因此,如果您的匹配策略很严格,您将无法在这两种不同类型之间进行映射。 现在要解决这个问题,只需将下面的代码放在控制器类的构造函数中,或者放在您想要使用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);

我希望java库的作者能够用他们的例子来说明问题。我在这一页上翻了三天,试图找出如何做到这一点。你知道为什么第一种方法会出错,而第二种方法会奏效吗。。。?这是我的案子way@ManuelGonçalves你会犯什么错误?编译错误,还是运行时错误?那是什么?我偶然发现了这个答案。我自己也在寻找一种解决方案,这种解决方案恰好适用于类似的问题,但并不完全相同。我正在寻找解决方案,可能的解决方案是什么?
modelMapper.map(student, studentDto);