如何将推土机用于 Set<Object> 映射 Set<String>,而 Set<String> 包含 obj.getProperty()

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()。

我想将 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 泛型,集合之间的映射几乎没有问题。它们在运行时不可用,您必须注意这一点。

所以在这种情况下,在运行时你将不得不收集并且基于集合类型你将无法确定集合源类型(只能通过检查某些元素可用)。

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

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

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

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

希望能解释你的问题!