Я пытаюсь использовать Dozer для преобразования объекта моего домена в объекты DTO. Итак, я хочу преобразовать PersistentList, PersistentBag, ... из объекта моего домена в ArrayList, ... в моих объектах DTO, чтобы избежать ленивой проблемы.
Это пример двух моих доменных сущностей:
public class User {
private Collection<Role> roles;
...
}
public class Role {
private Collection<User> users;
...
}
Мои объекты DTO такие же, за исключением того, что класс относится к типам DTO. Итак, чтобы преобразовать домен в объекты DTO, я использую следующее отображение Dozer:
<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 - это настраиваемый конвертер Dozer, и это его код:
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;
}}
Итак, я получаю объект User, который содержит PersistentBag с ролями. Я применяю карту Dozer Mapper к этому объекту, чтобы получить объект UserDTO. В результате я получаю объект UserDTO с ArrayList для Role, а не с ArrayList для RoleDTO, как я хотел.
Я думал, что даже если я воспользуюсь кастомным конвертером, dozer конвертирует содержимое моего списка. Это неправильный путь? Если нет, как сделать, чтобы преобразовать объект моего домена в объект dto, заменив постоянные коллекции классическими коллекциями Java?
Спасибо за вашу помощь.
Сильвен.