有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java的Dozer映射。lang.Date(作为映射字段)到XMLGregorianCalendar

我定义了一个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) 个答案

  1. # 1 楼答案

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

    下面是一个示例代码:

    
        &ltfield>  
           &lta key="myDateField">this&lt/a>
           &ltb>myXMLGregorianCalendarField&lt/b>
           &lta-hint>java.util.GregorianCalendar&lt/a-hint>
       &lt/field>
    
     

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

  2. # 2 楼答案

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

    在下面,查看数据类型转换标题中的最后三个选项。他们写道,这些可以在内部映射,而无需任何自定义转换器帮助:java。util。日期,爪哇。sql。日期,爪哇。sql。时间,爪哇。sql。时间戳,java。util。日历,java。util。格雷戈里安卡伦达

  3. # 3 楼答案

    我不确定您在上一节中的意思,但您可以尝试在目标类中使用自定义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中实现自定义setter,可能使用类似this的转换