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

2022-09-04 06:09:10

我正在使用Dozer在Document类到DocumentManagementBean类之间映射,这两者都是我自己制作的。两者都有一个属性,包括 getters 和 setters,Joda DateTime 类型,称为 dateAdded。

当 Document 对象具有属性 =x 时,调用所有字段都会被正确自动映射(因为我可以完全控制代码库,因此无需执行执行器配置,只需依靠匹配的属性名称),除了字段,其中新的 DocumentManagementBean 在其属性中以当前 DateTime 结束,而不是对象中的 x。ddateAddedmapper.map(d, DocumentManagementBean.class)dateAddeddmbdateAddedd

我期待推土机尝试致电

dmb.setDateAdded(d.getDateAdded());

并且只是将 dateAdded 的值从源带到目标,但它似乎正在为 dmb 对象创建新的 DateTime,然后让它单独存在。

任何人都可以为我解释一下吗?


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


推荐