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

时间:2012-08-17 22:09:25

标签: java mapping jodatime dozer

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

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

我期待Dozer试着打电话

dmb.setDateAdded(d.getDateAdded());

只需将dateAdded的值从source添加到target,但它似乎是为dmb对象创建新的DateTime然后单独使用它。

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

5 个答案:

答案 0 :(得分: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>

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

}

但它可能过头了,但是:)

答案 1 :(得分:14)

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

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

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

答案 2 :(得分: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>

答案 3 :(得分:0)

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

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

以下是更多信息:http://dozer.sourceforge.net/documentation/custommethods.html

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

答案 4 :(得分:0)

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

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