首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java8和ModelMapper中使用显式映射?

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

Stack Overflow用户
提问于 2018-02-27 16:08:29
回答 2查看 18.2K关注 0票数 19

我通过官方文档http://modelmapper.org/getting-started/学习了如何使用ModelMapper

下面是使用java 8进行显式映射的代码示例。

代码语言:javascript
复制
modelMapper.addMappings(mapper -> {
  mapper.map(src -> src.getBillingAddress().getStreet(),
      Destination::setBillingStreet);
  mapper.map(src -> src.getBillingAddress().getCity(),
      Destination::setBillingCity);
});

如何正确使用这段代码?当我在集成开发环境中键入此代码段时,集成开发环境会显示消息cannot resolve method map

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-27 16:58:57

他们在这个例子中遗漏了一个步骤,他们使用的addMappings方法是来自TypeMapaddMappings,而不是来自ModelMapper的。你需要为你的2个对象定义一个TypeMap。这样:

代码语言:javascript
复制
// 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。它也足够短:

代码语言:javascript
复制
ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(new PropertyMap<Order, OrderDTO>() {
  @Override
  protected void configure() {
    map().setBillingStreet(source.getBillingAddress().getStreet());
    map().setBillingCity(source.getBillingAddress().getCity());
  }
});
票数 55
EN

Stack Overflow用户

发布于 2020-06-25 01:42:10

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

代码语言:javascript
复制
@Entity
class Student {
    private Long id;
    
    @OneToOne
    @JoinColumn(name = "laptop_id")
    private Laptop laptop;
}

和Dto ->

代码语言:javascript
复制
class StudentDto {
    private Long id;
    private LaptopDto laptopDto;
}

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

代码语言:javascript
复制
private ModelMapper modelMapper;

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

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

代码语言:javascript
复制
modelMapper.map(student, studentDto);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49003929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档