Dozer, отображающий свойство JodaTime, не работает должным образом
Я использую Dozer для сопоставления класса Document с классом DocumentManagementBean, как моего собственного создания. У обоих есть свойство с геттерами и сеттерами типа Joda DateTime, называемое dateAdded.
Когда объект Document d
имеет свойство dateAdded
= x, вызывая mapper.map(d, DocumentManagementBean.class)
, все поля автоматически отображаются правильно (поскольку у меня есть полный контроль над базой кода, я могу уйти без dozer-config и полагаться просто на соответствие имен свойств), КРОМЕ dateAdded
области, где новый DocumentManagementBean dmb
заканчивается с текущей DateTime в его dateAdded
собственность, вместо х от d
объекта.
Я ожидаю, что Dozer попытается позвонить
dmb.setDateAdded(d.getDateAdded());
и просто принесите значение dateAdded из источника в цель, но, похоже, он создает новый объект DateTime для dmb, а затем оставляет его в покое.
Может ли кто-нибудь пролить свет на это для меня, пожалуйста?
Ответы
Ответ 1
Основная проблема заключается в том, что Dozer создает новый пустой экземпляр DateTime через новую DateTime(), а также то, как вы заканчиваете текущую дату/время, а не исходную. Могут быть несколько решений, я обычно пошел с настраиваемым преобразователем по всему миру:
<converter type="de.kba.resper.customconverter.DateTimeCustomConverter">
<class-a>org.joda.time.DateTime</class-a>
<class-b>org.joda.time.DateTime</class-b>
</converter>
и
public class DateTimeCustomConverter extends DozerConverter<DateTime, DateTime> {
public DateTimeCustomConverter() {
super(DateTime.class, DateTime.class);
}
@Override
public DateTime convertTo(final DateTime source, final DateTime destination) {
if (source == null) {
return null;
}
return new DateTime(source);
}
@Override
public DateTime convertFrom(final DateTime source, final DateTime destination) {
if (source == null) {
return null;
}
return new DateTime(source);
}
}
Он может переусердствовать, хотя:)
Ответ 2
Вероятно, вам это больше не нужно, но Dozer предоставляет возможность скопировать объект по ссылке, по крайней мере, с последней версией (теперь эта версия - 5.4.0). Копирование по ссылке - это то, что вы ищете.
<field copy-by-reference="true">
<a>copyByReference</a>
<b>copyByReferencePrime</b>
</field>
Документация: http://dozer.sourceforge.net/documentation/copybyreference.html
Ответ 3
Задайте глобальное свойство copy-by-reference в вашем XML файле
<copy-by-references>
<copy-by-reference>
org.joda.time.LocalDate
</copy-by-reference>
<copy-by-reference>
org.joda.time.LocalDateTime
</copy-by-reference>
</copy-by-references>
Ответ 4
Это можно сделать, но вам придется добавить некоторую конфигурацию:
<field>
<a set-method="placeValue" get-method="buildValue">value</a>
<b>value</b>
</field>
Вот дополнительная информация: http://dozer.sourceforge.net/documentation/custommethods.html
Dos Кто-то знает, как делать банки с аннотациями?
Ответ 5
Я думаю, что основная причина заключается в том, что DateTime неизменен, поэтому глубокая копия не может быть выполнена (см. https://github.com/DozerMapper/dozer/issues/216).
Вот почему вы должны использовать конвертер или копировать его по ссылке.