2012-04-03 2 views
0

У меня есть отображение XML определено:бульдозер отображение java.lang.Date (как поле карты), чтобы XMLGregorianCalendar

<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 

Как сделать эту работу преобразования правильно?

Примечания Long-долго отладки показали, что примитивные преобразователи называются по-разному для карт и " не-карта ". Итак, вот второй вопрос: почему?

+0

Вы говорите, что преобразование работает, когда 'Date' не является полем карты? – artbristol

+0

Да, у тебя все правильно. Преобразование работает отлично, когда 'Date' не является полем« Карта ». –

ответ

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.

+0

** 1) ** Нет метода 'com.example.MyClass # setMyXMLGregorianCalendarField (java.util.Date)' доступно. Только 'com.example.MyClass # setMyXMLGregorianCalendarField (javax.xml.datatype.XMLGregorianCalendar)' существует. ** 2) ** Dozer поставляется с 'XMLGregorianCalendarConverter', который отлично работает, если исходный объект (определенный тегом' ') ** ** ** ни один экземпляр' Map' –

+1

Я предположил, что 'MyClass' - ваш класс. Другой вариант - реализовать пользовательский конвертер, расширяющий класс DozerConverter, как описано [здесь] (http://dozer.sourceforge.net/documentation/customconverter.html) – darrengorman

+0

Конечно, реализация другого пользовательского конвертера - самый простой (и самый очевидный) способ сделать это преобразование, но я не хочу изобретать велосипед. У бульдозера уже есть такой конвертер, поэтому я хочу его повторно использовать. В любом случае, спасибо за вашу помощь! –

0

Вы можете использовать подсказку для неявного преобразования с даты на gregorian.

Здесь S пример кода:

 

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

Я не знаю, является ли бульдозер неявное преобразование типа или нет, но если это произойдет, то вам не нужно писать Exta метод пользовательского конвертера. В случае, если он не выполняет преобразование имплицита, попробуйте использовать метод getter или setter. , в котором выполняется дата преобразования GregorianCalendar. Смотрите это для пользовательских методов получения и установок: custom getter-setter

+0

Недавно я проверил его. Он делает имплицитное преобразование на дату в xmlgregoriancalander. Так что я думаю, вы хотите, чтобы какой-либо пользовательский конвертер. –

0

К сожалению, я нашел ответ здесь, Automatic conversion in dozer

Под этим, посмотрите на третьем последний вариант в преобразовании заголовка типа данных. Они написали, что они могут быть отображены внутри без какой-либо специальной помощи преобразователя: java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar