Как сериализовать java.sql.Date как Long при использовании веб-сервисов? - PullRequest
2 голосов
/ 15 декабря 2010

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

@WebMethod()
public SimpleClass myMethod();

@XmlRootElement()
public class SimpleClass {
    @XmlElement(name="myDate")
    @XmlJavaTypeAdapter(value=MyDateAdapter.class)
    public java.sql.Date myDate = new java.sql.Date(new java.util.Date().getTime());
}

Я хочу, чтобы java.sql.Date передавалось как длинное значение в XML (потому что клиент - J2ME, который не может обрабатывать сложные вещи). Для этой цели я выбрал решение, которое упоминалось во многих местах ранее, и отлично работал на Glassfish v2.

Сначала я объявляю следующий адаптер:

 public class MyDateAdapter extends XmlAdapter<Long, java.sql.Date> {
     public java.sql.Date unmarshal(Long v) throws Exception {
        return new java.sql.Date(v);
     }
     public Long marshal(java.sql.Date v) throws Exception {
         return v.getTime();
     }
 }

Затем я объявляю его использование в файле package-info следующим образом:

 @XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(value=MyDateAdapter.class,type=java.sql.Date.class)
 })
 package mingler.tracker.ejb.client;

Проблема возникает на GlassFish 3. Дата передается как значение «xs: dateTime» вместо Long, хотя я правильно определил адаптер. Вот ответ, который я получаю от сервера GlassFish 3, когда я вызываю свой веб-сервис:

<?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
     <S:Body>
         <ns2:myMethodResponse xmlns:ns2="http://nevermind.com">
             <return>
                 <myDate xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:dateTime">2010-12-09T12:44:06.875+02:00</myDate>
             </return>
         </ns2:myMethodResponse>
     </S:Body>
 </S:Envelope>

Я также проверил с отладчиком - функции в адаптере никогда не вызываются. С другой стороны, адаптер не бесполезен, потому что, если я пытаюсь удалить его, я получаю исключение JAXB, говорит мне, что java.sql.Date не может быть обработан, потому что у него нет конструктора без аргументов.

Есть идеи?

20.12.2010 - Я добавил ссылки на флягу проекта с источниками и результатами для glassfish2 и glassfish3:
файл jar , результат glassfish3 , результат glassfish2

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Я опубликовал ошибку для этой проблемы, ее необходимо устранить в версии 3.1 ( ссылка )

1 голос
/ 15 декабря 2010

У вас есть @XmlJavaTypeAdapter, объявленный как на уровне свойств, так и на уровне пакета.Вы пытались только объявить это в одном месте?

Либо:

@XmlJavaTypeAdapter(value=MyDateAdapter.class)
public java.sql.Date myDate = new java.sql.Date(new java.util.Date().getTime());

Или:

 @XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(value=MyDateAdapter.class,type=java.sql.Date.class)
 })
 package mingler.tracker.ejb.client;

Вместо обоих.

...