我定义了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
如何使转换正常工作?
注意 长时间的调试显示,对于地图和“非地图”,原始转换器的调用方式不同。所以这是第二个问题:为什么?
答案 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