Dozer-отображение java.lang.Date (в виде поля карты) в XMLGregorianCalendar - PullRequest
0 голосов
/ 03 апреля 2012

У меня определено сопоставление 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 голос
/ 03 апреля 2012

Я не уверен, что вы имеете в виду в последнем разделе, но вы можете попробовать использовать пользовательский установщик в классе назначения для выполнения этого отображения.

Ваш файл отображения будет выглядеть так:

<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 голосов
/ 17 мая 2012

Ой, я нашел ответ здесь, Автоматическое преобразование в dozer

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

0 голосов
/ 17 мая 2012

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

Вот пример кода:


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

 

Я не знаю, является ли dozer неявным преобразованием типа или нет, но если это так, то вам не нужно писать какой-либо пользовательский метод exta.В случае, если он не выполняет неявное преобразование, попробуйте пользовательский метод получения или установки.в котором выполнить преобразование даты в GregorianCalendar.См. Это для пользовательских методов получения и установки: пользовательские методы получения и установки

...