我尝试使用 Dozer 将我的域实体转换为 DTO 对象。所以,我想在我的 DTO 对象中将 PersistentList, PersistentBag, ... 从我的域实体转换为 ArrayList, ... 以避免惰性问题。
这是我的两个域实体的示例:
public class User {
private Collection<Role> roles;
...
}
public class Role {
private Collection<User> users;
...
}
我的 DTO 对象是相同的,只是该类是 DTO 类型。因此,要将域转换为 DTO 对象,我使用以下推土机映射:
<configuration>
<custom-converters>
<converter type=com.app.mapper.converter.BagConverter">
<class-a>org.hibernate.collection.PersistentBag</class-a>
<class-b>java.util.List</class-b>
</converter>
</custom-converters>
</configuration>
<mapping>
<class-a>com.app.domain.User</class-a>
<class-b>com.app.dto.UserDTO</class-b>
</mapping>
<mapping>
<class-a>com.app.domain.Role</class-a>
<class-b>com.app.dto.RoleDTO</class-b>
</mapping>
BagConverter 是一个推土机自定义转换器,这是它的代码:
public class BagConverter<T> extends DozerConverter<PersistentBag, List>{
public BagConverter() {
super(PersistentBag.class, List.class);
}
public PersistentBag convertFrom(List source, PersistentBag destination) {
PersistentBag listDest = null;
if (source != null) {
if (destination == null) {
listDest = new PersistentBag();
} else {
listDest = destination;
}
listDest.addAll(source);
}
return listDest;
}
public List convertTo(PersistentBag source, List destination) {
List listDest = null;
if (source != null) {
if (destination == null) {
listDest = new ArrayList<T>();
} else {
listDest = destination;
}
if (source.wasInitialized()) {
listDest.addAll(source);
}
}
return listDest;
}}
所以,我得到一个包含角色的 PersistentBag 的用户对象。我在该对象上应用推土机映射器地图以获取 UserDTO 对象。我得到的结果是一个 UserDTO 对象,它有一个 Role 的 ArrayList,没有我希望的 RoleDTO 的 ArrayList。
我以为即使我使用自定义转换器,推土机也会转换我列表的内容。这不是正确的方法吗?如果不是,如何通过将持久性集合替换为经典 java 集合来将我的域实体转换为 dto 对象?
谢谢你的帮助。
西尔万。