Подтвердить что ты не робот

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, а затем оставляет его в покое.

Может ли кто-нибудь пролить свет на это для меня, пожалуйста?

4b9b3361

Ответ 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).

Вот почему вы должны использовать конвертер или копировать его по ссылке.