Преобразование идентификатора пользовательского конвертера Dozer: объект в длинный и длинный в объект через DozerConverter getParameter - PullRequest
5 голосов
/ 08 декабря 2010

Мне нужна помощь в настройке файла сопоставления dozer.

В основном, я хотел бы знать, как получить пользовательский объект obejct для преобразования в Long userId.
Отсюда карта: user >> userId
Но у меня есть несколько объектов, таких как комментарий >> commentId или адрес >> addressId

для этого я хотел бы иметь что-то более элегантное, чем просто написание карт для каждого из полей. Все объекты реализуют загружаемый интерфейс.

Нижеследующий код теперь работает благодаря методу getParameter () DozerConverter, но, если вы знаете какой-либо способ лучше, чем конвертер, который я написал, сообщите мне. * // dozer.xml <?xml version="1.0" encoding="UTF-8"?> <mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"> <configuration> <custom-converters> <converter type="project.shared.domain.dto.dozer.LoadableIdConverter" > <class-a>project.shared.domain.Loadable</class-a> <class-b>java.lang.Long</class-b> </converter> </custom-converters> </configuration> <mapping> <class-a>project.shared.domain.Suggestion</class-a> <class-b>project.shared.domain.dto.DTOSuggestion</class-b> <field custom-converter-param="User"> <a>user</a> <b>userId</b> </field> </mapping> </mappings>\ // Контекст приложения Spring <bean id="loadableIdConverter" class="project.shared.domain.dto.dozer.LoadableIdConverter"> <property name="userService" ref="userService"/> <property name="commentService" ref="commentService"/> <property name="addressService" ref="addressService"/> </bean> <bean id="gwtMapper" class="org.dozer.DozerBeanMapper"> <property name="mappingFiles"> <list> <value>classpath:/dozer.xml</value> </list> </property> <property name="customConverters"> <list> <ref bean="loadableIdConverter"/> </list> </property> </bean> // Стандартный объект спящего режима public class Suggestion implements Serializable, Loadable { private long id = -1; private Date dateCreated; private User user; //trying to use dozer to covert this bad boy to Long userId //... } // DTO объект public class DTOSuggestion implements IsSerializable { private long id = -1; private Date dateCreated; private Long userId; //trying to get this ID via the dozer converter //... } // Загружаемый интерфейс public interface Loadable extends Serializable { public long getId(); public void setId(long id); } // Дозер-конвертер public class LoadableIdConverter extends DozerConverter<Loadable, Long> { private UserService userService; //configured in applicationcontext private AddressService addressService; //configured in applicationcontext private CommentService commentService; //configured in applicationcontext public LoadableIdConverter() { super(Loadable.class, Long.class); } public Long convertTo(Loadable object, Long id) { return object.getId(); } public Loadable convertFrom(Long id, Loadable object) { if (id < 0) return null; String loadable = getParameter(); if (loadable.equalsIgnoreCase("User")) return userService.get(User.class, id); if (loadable.equalsIgnoreCase("Address")) return addressService.get(Address.class, id); if (loadable.equalsIgnoreCase("Comment")) return commentService.get(Comment.class, id); return null; } }

1 Ответ

3 голосов
/ 31 декабря 2010

Есть один трюк, который вы можете использовать, чтобы избежать параметров конвертера.Если вы вернетесь к более старому подходу к пользовательскому конвертеру в Dozer, который реализует интерфейс CustomConverter, вы получите два дополнительных параметра: существующиеDestinationValue и destinationClass.

convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) 

Используя эти значения, вы можете проанализировать поле назначения через отражениеи знать, какова ожидаемая конкретная реализация интерфейса Loadable.Это работает, только если вы определяете типы полей с конкретными типами, конечно.Но у вас уже есть это в вашем примере, так что это не должно быть проблемой.Реализация CustomConverter будет более многословной, поскольку вам нужно определить направление отображения вручную, но она дает вам полный контроль над тем, что происходит во время процесса отображения.

...