13

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

当 Document 对象d具有属性dateAdded=x 时,调用mapper.map(d, DocumentManagementBean.class)所有字段都会正确地自动映射(因为我可以完全控制代码库,所以我可以在没有推土机配置的情况下逃脱,只依赖匹配的属性名称),除了dateAdded字段,其中新的 DocumentManagementBean在其属性中以当前的DateTimedmb结束,而不是对象中的 x 。dateAddedd

我期待推土机尝试打电话

dmb.setDateAdded(d.getDateAdded());

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

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

4

5 回答 5

16

基本问题是 Dozer 通过 new 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);
        }

}

不过,它可能会做得过火:)

于 2012-08-23T08:51:49.087 回答
14

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

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

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

于 2013-01-07T09:54:47.213 回答
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>
于 2014-09-26T13:57:21.280 回答
0

可以这样做,但您必须添加一些配置:

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

这里有更多信息:http ://dozer.sourceforge.net/documentation/custommethods.html

有人知道如何用注释做罐子吗?

于 2012-08-23T08:42:43.293 回答
0

我认为根本原因是 DateTime 是不可变的,所以无法完成深拷贝(参见https://github.com/DozerMapper/dozer/issues/216)。

这就是为什么您必须使用转换器或通过引用复制它的原因。

于 2017-09-19T14:59:57.363 回答