当前位置: 首页 > 知识库问答 >
问题:

ModelMapper匹配策略:具有参考类型的标准

邵星河
2023-03-14

实体类:

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)

我在U中使用了2种引用类型名称和地址ser.java.在为User创建对象时,我也传递了名称和地址详细信息。当我尝试将User对象映射到UserDTO时,名称详细信息被成功映射,但地址详细信息没有被映射。

有谁能帮我理解为什么会这样,或者我错过了什么?

共有1个答案

焦兴为
2023-03-14

使用匹配策略。松散一切正常。

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

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

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

这样,只需添加一行:



    @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}
 类似资料:
  • 1.1. ID 体系设计 事件表和用户表都包含 userId 属性,该属性作为用户的唯一标识。 有两种场景: 基于设备来作为用户标识:这种场景下,用户标识比较准确,但无法跨端做用户匹配 基于用户ID来作为用户标识:可跨端做用户匹配,但用户在匿名和注册,以及登出及登入过程,会有可能出现多个 userId,导致日活、留存、漏斗等统计有差距。 1.2. 基于用户 ID 做为用户标识的优化方案 1.2.1

  • 对于 SELinux 来说,所选择的策略类型直接决定了使用哪种策略规则来执行主体(进程)可以访问的目标(文件或目录资源)。不仅如此,策略类型还决定需要哪些特定的安全上下文属性。通过策略类型,读者可以更精确地了解 SELinux 所实现的访问控制。 SELinux 提供 3 种不同的策略可供选择,分别是 Targeted、 MLS 以及 MiNimum。每个策略分别实现了可满足不同需求的访问控制,因

  • 看看这个代码。 愚蠢的Scala编译器在这里显示错误: 错误:(22, 39) 类型不匹配;找到: mix.type (底层类型 SomeMix) 必需: T with SomeMix 大小写混合: SomeMix = 它不理解表达式I匹配到在某种混合已经是类型T。好吧,让我们帮助他。更改代码: 现在,它同意一切都是正确的,但显示警告: 警告:(22,17)抽象类型模式T未选中,因为它已通过擦除大

  • 我想消除此示例代码中的类型擦除警告: 它编译和工作正常,但有一个警告: 警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]= 在这种情况下,你有什么简单的解决方案来避免擦除吗? 到目前为止,我尝试了什么(根据这一点): 但是它不能编译,因为c现在是Any类型。 我相信这个问题有几种解决方法。我会接受最简单的

  • 问题内容: 我第一次使用JavaFx,遇到事件问题。我用SceneBuilder构建了一个表单,并在.fxml和controller上添加了一个事件,但始终返回: FirstScene.fxml: FirstSceneController.java: JavaFxApplication.java: 例外: 我将非常感谢您的帮助。 问题答案: 使用,而不是。

  • 问题内容: Mockito提供: 如何避免警告,如果需要呢? 问题答案: 对于Java 8及更高版本,很简单: 对于Java 7及更低版本,编译器需要一些帮助。用途: