【问题标题】:ModelMapper Matching Strategy: Standard with Reference TypesModelMapper 匹配策略:带有引用类型的标准
【发布时间】:2018-03-07 10:41:20
【问题描述】:

实体类:

class User{
    private Name name;
    private int age;
    private String email;
    private Date dob;
    private Address address;

  // No Arguments Constructor , All Arguments Constructor , Setters, Getters and toString
}


class Name {
    private String firstName;
    private String lastName;

   // No Arguments Constructor , All Arguments Constructor , Setters, Getters and toString
}

class Address {
    private String houseNo;
    private String street;
    private String city;
    private Integer pincode;

    // No Arguments Constructor , All Arguments Constructor , Setters, Getters and toString
}

DTO:

class UserDTO{
    private String firstName;
    private String lastName;
    private int age;
    private String email;
    private Date dob;
    private String houseNo;
    private String street;
    private String city;
    private Integer pincode;

   // No Arguments Constructor , All Arguments Constructor , Setters, Getters and toString
 }

将实体转换为 DTO 的代码:

public class ReferenceTypePropertiesMapper {

@Test
public void shouldPopulateAllSimpleProperties(){
    User user = createUser();
    ModelMapper modelMapper = new ModelMapper();
    UserDTO userDTO = modelMapper.map(user,UserDTO.class);

    System.out.println("Source : "+ user);
    System.out.println("Destination : "+ userDTO);
}

private User createUser(){
    Name name = new Name("Siva", "Prasad");
    Address address = new Address("1-93","ABC","HYD",123456);
    return new User(name, 29, "Siva@gmail.com", new Date(), address);
  }
}

输出:

Source : User(name=Name(firstName=Siva, lastName=Prasad), age=29, email=Siva@gmail.com, dob=Tue Sep 26 14:38:45 IST 2017, address=Address(houseNo=1-93, street=ABC, city=HYD, pincode=123456))

Destination : UserDTO(firstName=Siva, lastName=Prasad, age=29, email=Siva@gmail.com, dob=Tue Sep 26 14:38:45 IST 2017, houseNo=null, street=null, city=null, pincode=null)

我在 User.java 中使用了 2 个引用类型 NameAddress。 在为 User 创建对象时,我还传递了 Name 和 Address 详细信息。当我尝试将 User 对象映射到 UserDTO 时,Name 详细信息已成功映射,但 Address 详细信息未成功得到映射。

任何机构都可以帮助我理解为什么会这样吗?还是我错过了什么?

【问题讨论】:

    标签: modelmapper


    【解决方案1】:

    MatchingStrategies.LOOSE 一切正常。

    松散匹配策略允许源属性与目标属性松散匹配,方法是要求匹配层次结构中的最后一个目标属性。以下规则适用:

    • 令牌可以按任意顺序匹配
    • 最后一个目标属性名称必须有所有个匹配的标记
    • 最后一个源属性名称必须至少有 一个标记匹配

    松散匹配策略非常适合用于具有非常不同的属性层次结构的源和目标对象模型。 这可能会导致检测到更高级别的模糊匹配,但对于众所周知的对象模型,它可以作为定义映射的快速替代方法

    这种方式只需要添加一行:

    
    
        @Test
        public void shouldPopulateAllSimpleProperties() {
            User user = createUser();
            ModelMapper modelMapper = new ModelMapper();
            modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);
            UserDTO userDTO = modelMapper.map(user, UserDTO.class);
    
            System.out.println("Source : " + user);
            System.out.println("Destination : " + userDTO);
        }
    

    输出:

    Source : User{name=Name{firstName='Siva', lastName='Prasad'}, age=29, email='Siva@gmail.com', dob=Wed Oct 18 23:44:25 MSK 2017, address=Address{houseNo='1-93', street='ABC', city='HYD', pincode=123456}}
    Destination : UserDTO{firstName='Siva', lastName='Prasad', age=29, email='Siva@gmail.com', dob=Wed Oct 18 23:44:25 MSK 2017, houseNo='1-93', street='ABC', city='HYD', pincode=123456}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2016-05-15
      • 1970-01-01
      相关资源
      最近更新 更多