我正在使用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然后单独使用它。
有人可以为我解释一下吗?
答案 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)。通过引用复制是您正在寻找的。 p>
<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)。
这就是你必须使用转换器或通过引用复制它的原因。