Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 推土机映射JodaTime属性未按预期工作_Java_Mapping_Jodatime_Dozer - Fatal编程技术网

Java 推土机映射JodaTime属性未按预期工作

Java 推土机映射JodaTime属性未按预期工作,java,mapping,jodatime,dozer,Java,Mapping,Jodatime,Dozer,我正在使用Dozer在Document类和DocumentManagementBean类之间映射,这两个类都是我自己创建的。两者都有一个Joda DateTime类型的属性,包括getter和setter,称为dateAdded 当文档对象d具有属性dateAdded=x时,调用mapper.map(d,DocumentManagementBean.class)所有字段都会正确自动映射(因为我完全控制代码库,所以我可以不使用推土机配置,只依赖匹配的属性名称),除了dateAdded字段,其中,新

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

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

我在等推土机打电话来

dmb.setDateAdded(d.getDateAdded())

只需将dateAdded的值从源代码带到目标代码,但它似乎是在为dmb对象创建新的DateTime,然后就不用管它了


有人能帮我解释一下吗?

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

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


Dos有人知道如何使用注释进行TIN吗?

基本问题是,Dozer通过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>

org.joda.time.DateTime
org.joda.time.DateTime

公共类DateTimeCustomConverter扩展DozerConverter{
公共DateTimeCustomConverter(){
super(DateTime.class,DateTime.class);
}
@凌驾
公共日期时间转换器(最终日期时间源、最终日期时间目标){
if(source==null){
返回null;
}
返回新的日期时间(源);
}
@凌驾
公共日期时间转换源(最终日期时间源、最终日期时间目标){
if(source==null){
返回null;
}
返回新的日期时间(源);
}
}

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

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

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


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

org.joda.time.LocalDate
org.joda.time.LocalDateTime

我认为根本原因是DateTime是不可变的,因此无法进行深度复制(请参阅)


这就是为什么您必须使用转换器或通过引用复制它。

谢谢,我提出了类似的方法,但觉得不太正确,所以请等待是否有人可能提供更清洁的解决方案。再次感谢!因为DateTime是不可变的,所以推土机转换器没有意义。因此,通过引用复制的解决方案应该比定制的ConverterYep更受欢迎,这是一种简单的解决方案,对不可变项非常有效。Merci Pras,t'es mon héros:)这个解决方案对我来说是最干净的解决方案
    <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>