0

实体类:

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 个引用类型名称地址。在为 User 创建对象时,我还传递了 Name 和 Address 详细信息。当我尝试将User对象映射到UserDTO时,名称详细信息已成功映射,但地址详细信息未映射。

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

4

1 回答 1

0

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}
于 2017-10-18T21:17:50.480 回答