Dozer mapping JodaTime property not working as expected

前提是你 提交于 2019-12-04 01:45:53

The basic problem is that Dozer creates a new blank instance of DateTime, via new DateTime(), and thats how you end up with the current date/time instead of the original one. There might be multiple solutions, I usually went with a customconverter, globally defined:

    <converter type="de.kba.resper.customconverter.DateTimeCustomConverter">
        <class-a>org.joda.time.DateTime</class-a>
        <class-b>org.joda.time.DateTime</class-b>
    </converter>

and

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);
        }

}

It may overdo it, though :)

You probably don't need it anymore, but Dozer provides the chance to copy an object by reference, at least with the latest version (now, this version is 5.4.0). Copying by reference is what you are looking for.

<field copy-by-reference="true">
  <a>copyByReference</a>
  <b>copyByReferencePrime</b>
</field>

Documentation: http://dozer.sourceforge.net/documentation/copybyreference.html

Set a copy-by-reference global property in your xml file

    <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>

It is possible to do it but you will have to add some configuration:

<field>
  <a set-method="placeValue" get-method="buildValue">value</a>
  <b>value</b>  
</field>

Here is more information: http://dozer.sourceforge.net/documentation/custommethods.html

Dos some one knows how to do tins with annotations?

I think the root cause is that DateTime is immutable, so the deep copy cannot be done (see https://github.com/DozerMapper/dozer/issues/216).

That's why you have to use a converter or copy it by reference.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!