如何使用dozer进行Set <object>映射Set <string>,而Set <string>包含obj.getProperty()

时间:2017-03-31 03:12:14

标签: java dozer

如何使用dozer进行字段Set<Object>映射Set<String>,而Set<String>包含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;
}

1 个答案:

答案 0 :(得分:0)

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

因此,在这种情况下,在运行时,您将需要集合,并且基于您赢得的集合类型,无法确定集合源类型(仅通过检查它将可用的某个元素)。

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

<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!");
   }
}

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

<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]}

希望能解释你的问题!