我正在使用Dozer在我自己编写的Document类与DocumentManagementBean类之间进行映射。两者都具有Joda DateTime类型的属性,具有getter和setter方法,称为dateAdded。
当Document对象d
具有dateAdded
= x属性时,调用mapper.map(d, DocumentManagementBean.class)
可以正确地自动映射所有字段(由于我完全控制了代码库,因此我无需使用dozer-config就可以逃脱,仅依靠匹配的属性名即可), dateAdded
字段,新的DocumentManagementBean dmb
在其dateAdded
属性中以当前当前 DateTime结尾,而不是d
对象中的x。
我希望推土机尝试致电dmb.setDateAdded(d.getDateAdded());
并将dateAdded的值从源带到目标,但似乎正在为dmb对象创建新的DateTime,然后将其保留。
有人可以帮我阐明一下吗?
最佳答案
基本的问题是,推土机通过new 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);
}
}
但是,它可能会超标:)