推土机映射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 )。
这就是为什么你必须使用转换器或通过引用复制它。