【问题标题】:Dozer mapping of java.lang.Date (as a Map field) to XMLGregorianCalendarjava.lang.Date(作为 Map 字段)到 XMLGregorianCalendar 的推土机映射
【发布时间】:2012-04-03 14:56:19
【问题描述】:

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

如何使这种转换正常进行?

注意 长时间的调试表明,对于地图和“非地图”,原始转换器的调用方式不同。那么第二个问题来了:为什么?

【问题讨论】:

  • 您是说当Date 不是地图字段时转换有效吗?
  • 是的,你没看错。当Date 不是Map 字段时,转换工作得很好。

标签: java date map dozer


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

【讨论】:

  • 1) 没有可用的方法com.example.MyClass#setMyXMLGregorianCalendarField(java.util.Date)。只有com.example.MyClass#setMyXMLGregorianCalendarField(javax.xml.datatype.XMLGregorianCalendar) 存在。 2) 推土机附带XMLGregorianCalendarConverter,如果源对象(由&lt;class-a&gt; 标签定义)不是Map 的任何实例,则它可以正常工作
  • 我认为MyClass 是你的班级。您的另一种选择是实现自定义转换器扩展DozerConverter 类,如here 所述
  • 当然实现另一个自定义转换器是进行这种转换的最简单(也是最明显)的方法,但我不想重新发明轮子。推土机已经内置了这样的转换器,所以我想重用它。无论如何,感谢您的帮助!
  • 我同意。很遗憾XMLGregorianCalendarConverter 没有为这种情况扩展DozerConverter 类。如果对您有帮助,请接受我的回答:)
【解决方案2】:

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

这是一个示例代码:

&lta key="myDateField">这个&lt/a> &ltb>myXMLGregorianCalendarField&lt/b> &lta-hint>java.util.GregorianCalendar&lt/a-hint> &lt/字段>

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

【讨论】:

  • 我最近查了一下。它确实将日期隐式转换为 xmlgregoriancalander。所以我认为,您需要任何自定义转换器。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多