推土机映射JodaTime属性不按预期工作

Pet*_*háč 13 java mapping jodatime dozer

我正在使用Dozer在Document类和DocumentManagementBean类之间进行映射,这两个都是我自己制作的.两者都有一个Joda DateTime类型的getter和setter属性,名为dateAdded.

当Document对象d具有property dateAdded= x时,调用mapper.map(d, DocumentManagementBean.class)所有字段都会自动正确映射(因为我可以完全控制代码库,我可以通过没有dozer-config而只依赖于匹配的属性名称),除了dateAdded字段,其中新的DocumentManagementBean 以其属性中dmb当前 DateTime 结束dateAdded,而不是来自d对象的x .

我期待Dozer试着打电话

dmb.setDateAdded(d.getDateAdded());

并且只是将dateAdded的值从source添加到target,但它似乎是为dmb对象创建新的DateTime然后单独留下它.

有人可以为我解释一下吗?

Sco*_*pio 16

基本问题是Dozer通过新的DateTime()创建一个新的DateTime空白实例,这就是你如何结束当前日期/时间而不是原始日期/时间.可能有多种解决方案,我通常使用全局定义的customconverter:

    <converter type="de.kba.resper.customconverter.DateTimeCustomConverter">
        <class-a>org.joda.time.DateTime</class-a>
        <class-b>org.joda.time.DateTime</class-b>
    </converter>
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

它可能过头了,但:)


Tha*_*ish 14

您可能不再需要它,但Dozer提供了通过引用复制对象的机会,至少使用最新版本(现在,此版本为5.4.0).通过引用复制是您正在寻找的.

<field copy-by-reference="true">
  <a>copyByReference</a>
  <b>copyByReferencePrime</b>
</field>
Run Code Online (Sandbox Code Playgroud)

文档:http://dozer.sourceforge.net/documentation/copybyreference.html


Pra*_*ras 5

在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>
Run Code Online (Sandbox Code Playgroud)