Dozer mapping JodaTime property not working as expected

后端 未结 5 1802
野性不改
野性不改 2021-02-19 14:05

I am using Dozer to map between a Document class to DocumentManagementBean class, both of my own making. Both have a property, with getters and setters, of Joda DateTime type, c

相关标签:
5条回答
  • 2021-02-19 14:22

    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?

    0 讨论(0)
  • 2021-02-19 14:38

    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>
    
    0 讨论(0)
  • 2021-02-19 14:40

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

    0 讨论(0)
  • 2021-02-19 14:40

    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.

    0 讨论(0)
  • 2021-02-19 14:41

    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

    0 讨论(0)
提交回复
热议问题