Dozer将java.lang.Date(作为Map字段)映射到XMLGregorianCalendar

时间:2012-04-03 14:56:20

标签: java date map dozer

我定义了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>

密钥myDateField的此值包含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

如何使转换正常工作?

注意 长时间的调试显示,对于地图和“非地图”,原始转换器的调用方式不同。所以这是第二个问题:为什么?

3 个答案:

答案 0 :(得分:1)

我不确定你在上一节中的含义,但你可以尝试在目标类中使用自定义setter来执行此映射。

您的映射文件如下所示:

<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中实施自定义设置器,可能使用this之类的转换。

答案 1 :(得分:0)

您可以尝试将提示标记隐含地从日期转换为格里高利。

这是一个示例代码:


    <field>  
       <a key="myDateField">this</a>
       <b>myXMLGregorianCalendarField</b>
       <a-hint>java.util.GregorianCalendar</a-hint>
   </field>

 

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

答案 2 :(得分:0)

糟糕,我在这里找到了答案, Automatic conversion in dozer

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