我正在使用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);
        }

}

但是,它可能会超标:)

10-07 15:51