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

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

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

我期待Dozer试着打电话

dmb.setDateAdded(d.getDateAdded());

并且只是将dateAdded的值从source添加到target,但它似乎是为dmb对象创建新的DateTime然后让它一个接一个。

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

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

   org.joda.time.DateTime org.joda.time.DateTime  

 public class DateTimeCustomConverter extends DozerConverter { 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); } } 

它可能过头了,但:)

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

  copyByReference copyByReferencePrime  

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

在xml文件中设置按引用复制的全局属性

    org.joda.time.LocalDate   org.joda.time.LocalDateTime   

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

  value value  

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

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

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

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