0

我定义了一个 xml 映射:

<mapping>
    <class-a>java.util.HashMap</class-a>
    <class-b>com.example.MyClass</class-b>
    <field>
        <a key=&quot;myDateField&quot;>this</a>
        <b>myXMLGregorianCalendarField</b>
    </field>
</mapping>

这里 keymyDateField的值包含java.lang.Date class. 字段com.example.MyClass#myXMLGregorianCalendarField需要 的实例javax.xml.datatype.XMLGregorianCalendar

此映射总是抛出异常:

MapId: null
Type: null
Source parent class: java.util.HashMap
Source field name: this
Source field type: class java.util.Date
Source field value: Thu Jan 01 03:00:00 MSK 1970
Dest parent class: com.example.MyClass
Dest field name: myXMLGregorianCalendarField
Dest field type: javax.xml.datatype.XMLGregorianCalendar
org.dozer.MappingException: Illegal object type for the method 'setMyXMLGregorianCalendarField'. 
Expected types: 
    javax.xml.datatype.XMLGregorianCalendar
Actual types: 
    java.util.Date

如何使这种转换正常工作?

注意 Long-long 调试显示原始转换器对地图和“非地图”的调用方式不同。那么第二个问题来了:为什么?

4

3 回答 3

1

我不确定您在上一节中的意思,但您可以尝试在目标类中使用自定义设置器来执行此映射。

您的映射文件如下所示:

<mapping>
    <class-a>java.util.HashMap</class-a>
    <class-b>com.example.MyClass</class-b>
    <field>
        <a key="myDateField">this</a>
        <b set-method="setMyXMLGregorianCalendarField(java.util.Date)">myXMLGregorianCalendarField</b>
    </field>
</mapping>

实现自定义设置器MyClass,也许使用这样的转换

于 2012-04-03T15:09:08.837 回答
0

您可以尝试使用提示标签将日期隐式转换为公历。

这是示例代码:

    <字段>  
       <a key="myDateField">这个</a>
       <b>myXMLGregorianCalendarField</b>
       <a-hint>java.util.GregorianCalendar</a-hint>
   </字段>

 

我不知道 dozer 是否是隐式类型转换,但如果是,那么您不需要编写任何 exta 自定义转换器方法。如果它不执行隐式转换,请尝试自定义 getter 或 setter 方法。其中执行日期到 GregorianCalendar 的转换。有关自定义 getter 和 setter 方法,请参见此内容:custom getter-setter

于 2012-05-17T06:48:28.040 回答
0

糟糕,我在这里找到了答案, 推土机中的自动转换

在此之下,查看数据类型转换标题中的倒数第三个选项。他们写道,这些可以在内部映射而无需任何自定义转换器帮助:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、java.util.Calendar、java.util.GregorianCalendar

于 2012-05-17T06:51:57.990 回答