Единственное общее решение, которое я нашел для управления этим (после просмотра пользовательских конвертеров, прослушивателей событий и прокси-серверов Resolvers), заключается в реализации Custom Field Mapper. Я обнаружил, что эта функциональность скрыта в Dozer API (я не верю, что это задокументировано в Руководстве пользователя).
Простой пример:
public class MyCustomFieldMapper implements CustomFieldMapper
{
public boolean mapField(Object source, Object destination, Object sourceFieldValue, ClassMap classMap, FieldMap fieldMapping)
{
// Check if field is a Hibernate collection proxy
if (!(sourceFieldValue instanceof AbstractPersistentCollection)) {
// Allow dozer to map as normal
return false;
}
// Check if field is already initialized
if (((PersistentSet) sourceFieldValue).wasInitialized()) {
// Allow dozer to map as normal
return false;
}
// Set destination to null, and tell dozer that the field is mapped
destination = null;
return true;
}
}
Это вернет все неинициализированные объекты PersistentSet как ноль. Я делаю это так, чтобы, когда они передаются клиенту, я мог различать пустую (не загруженную) коллекцию и пустую коллекцию. Это позволяет мне определить общее поведение в клиенте, чтобы использовать предварительно загруженный набор или сделать другой вызов службы для получения набора (если требуется). Кроме того, если вы решите загружать любые коллекции на уровне сервиса, они будут отображаться как обычно.
Я добавляю специальный маппер поля, используя пружину:
<bean id="dozerMapper" class="org.dozer.DozerBeanMapper" lazy-init="false">
<property name="mappingFiles">
...
</property>
<property name="customFieldMapper" ref="dozerCustomFieldMapper" />
</bean>
<bean id="dozerCustomFieldMapper" class="my.project.MyCustomFieldMapper" />
Надеюсь, это поможет любому, кто ищет решение для этого, поскольку я не смог найти никаких примеров при поиске в Интернете.