【问题标题】:Dozer mapping JodaTime property not working as expected推土机映射 JodaTime 属性未按预期工作
【发布时间】:2012-08-17 22:09:25
【问题描述】:

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

当 Document 对象 d 具有属性 dateAdded=x 时,调用 mapper.map(d, DocumentManagementBean.class) 所有字段都会正确地自动映射(因为我可以完全控制代码库,所以我可以在没有推土机配置的情况下逃脱并依赖只是匹配属性名称),除了 dateAdded 字段,其中新的 DocumentManagementBean dmbcurrent DateTime 在其 dateAdded 属性中结束,而不是来自 d 对象的 x .

我期待推土机尝试打电话

dmb.setDateAdded(d.getDateAdded());

只需将 dateAdded 的值从源带到目标,但它似乎正在为 dmb 对象创建新的 DateTime 然后不理会它。

谁能帮我解释一下?

【问题讨论】:

    标签: java mapping jodatime dozer


    【解决方案1】:

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

        <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);
            }
    
    }
    

    不过,它可能做得过火了:)

    【讨论】:

    • 谢谢,我想出了类似的东西,但觉得不太正确,所以等待有人可能会提供更清洁的解决方案。再次感谢!
    • 恕我直言,推土机转换器没有意义,因为 DateTime 是不可变的。因此,应首选按引用复制解决方案而不是自定义转换器
    【解决方案2】:

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

    <field copy-by-reference="true">
      <a>copyByReference</a>
      <b>copyByReferencePrime</b>
    </field>
    

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

    【讨论】:

    • 是的,非常适合不可变对象的简单解决方案。
    【解决方案3】:

    在您的 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>
    

    【讨论】:

    • 谢谢普拉斯,谢谢你 :)
    • 这为我修好了,似乎是最干净的解决方案
    【解决方案4】:

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

    <field>
      <a set-method="placeValue" get-method="buildValue">value</a>
      <b>value</b>  
    </field>
    

    这里有更多信息:http://dozer.sourceforge.net/documentation/custommethods.html

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

    【讨论】:

      【解决方案5】:

      我认为根本原因是 DateTime 是不可变的,所以无法进行深拷贝(参见https://github.com/DozerMapper/dozer/issues/216)。

      这就是你必须使用转换器或通过引用复制它的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多