java的Dozer映射。lang.Date(作为映射字段)到XMLGregorianCalendar
我定义了一个xml映射:
<mapping>
<class-a>java.util.HashMap</class-a>
<class-b>com.example.MyClass</class-b>
<field>
<a key="myDateField">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
如何使此转换正常工作强>
注意 长时间的调试表明,对于映射和“非映射”,对基元转换器的调用是不同的。第二个问题来了:为什么强>
# 1 楼答案
您可以尝试使用提示标记将日期隐式转换为公历
下面是一个示例代码:
我不知道dozer是否支持隐式类型转换,但如果它支持隐式类型转换,那么就不需要编写任何exta自定义转换器方法。 如果它不执行隐式转换,请尝试自定义getter或setter方法。 在其中执行从日期到日历的转换。 有关自定义getter和setter方法,请参见以下内容:custom getter-setter
# 2 楼答案
哦,我在这里找到了答案, Automatic conversion in dozer
在下面,查看数据类型转换标题中的最后三个选项。他们写道,这些可以在内部映射,而无需任何自定义转换器帮助:java。util。日期,爪哇。sql。日期,爪哇。sql。时间,爪哇。sql。时间戳,java。util。日历,java。util。格雷戈里安卡伦达
# 3 楼答案
我不确定您在上一节中的意思,但您可以尝试在目标类中使用自定义setter来执行此映射
您的映射文件如下所示:
在
MyClass
中实现自定义setter,可能使用类似this的转换