如何使用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;
}
答案 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]}
希望能解释你的问题!