【问题标题】:How can I use dozer for Set<Object> mapping Set<String>, while Set<String> contains obj.getProperty()如何使用推土机进行 Set<Object> 映射 Set<String>,而 Set<String> 包含 obj.getProperty()
【发布时间】:2017-03-31 03:12:14
【问题描述】:

如何将推土机用于字段Set&lt;Object&gt; 映射Set&lt;String&gt;,而Set&lt;String&gt; 包含obj.getProperty()。

我想将 User.roleSet 映射到 UserVO.roleNames,其中包含 Role.name。

public class User {

   private Integer id;

   private Set<Role> roleSet;
}

public class UserVO {

    private Integer id;

    private Set<String> roleNames;
}

public class Role {

    private Integer id;

    private String name;
}

【问题讨论】:

    标签: java dozer


    【解决方案1】:

    有几种方法可以解决这个问题,但首先要了解的是集合之间的映射,由于 Java 泛型,所以问题不大。它们在运行时不可用,您必须注意这一点。

    因此,在这种情况下,在运行时您将不得不进行集合,并且根据集合类型,您将无法确定集合源类型(只有通过检查某些元素才可用)。

    在这种情况下,我认为最好的方法是定义您自己的自定义转换器(您必须在自定义转换器标签内的推土机配置文件中注册)。那部分看起来像这样:

    <configuration>
    <custom-converters>
      <converter type="ToRoleNameConverter">
        <class-a>Role</class-a>
        <class-b>java.lang.String</class-b>
      </converter>
    </custom-converters>
    

    该转换器的源代码:

    public class ToRoleNameConverter extends DozerConverter<Role, String> {
    
        @SuppressWarnings("unchecked")
        public ToRoleNameConverter() {
           super(Role.class, String.class);
        }
    
        @Override
        public String convertTo(Role source, String destination) {
            return source.getName();
        }
    
        @Override
        public Role convertFrom(String source, Role destination) {
           throw new UnsupportedOperationException("Unsupported operation exception!");
       }
    }
    

    使用该转换器,您可以定义基本类和嵌入式集合的映射方式。需要额外的推土机配置:

    <mapping>
      <class-a>User</class-a>
      <class-b>UserDto</class-b>
      <field>
        <a>roles</a>
        <b>roleNames</b>
        <a-hint>Role</a-hint>
        <b-hint>java.lang.String</b-hint>
      </field>
    </mapping>
    

    使用给定的配置,您应该尝试映射:

    User user = new User()
    user.setUserId(1)
    user.setRoles(Sets.newHashSet(new Role(1, "admin"), new Role(2, "manager")))
    
    UserDto map = mapper.map(user, UserDto.class)
    

    并得到结果:

    User{id=1, roles=[Role{id=2, name=manager}, Role{id=1, name=admin}]}
    UserDto{id=1, roleNames=[manager, admin]}
    

    希望能解释你的问题!

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      相关资源
      最近更新 更多