2010-12-15 2 views
2

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

@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(); 
    } 
} 

Тогда я объявляю его использование в пакет-инфо файла, как это:

@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 не может быть обработан, потому что у него нет конструктора no-arg.

Любые идеи?

20/12/2010 - Я добавил ссылки на проект баночку с источниками и результаты для glassfish2 и glassfish3:
jar file, glassfish3 result, glassfish2 result

+0

Вы говорите, это же код разворачивает и работает, как ожидается, на GF v2? – Preston 2010-12-15 15:09:06

+0

Да, я добавил проектную фразу и подробные результаты для работы на GFv2 & 3. Он работает как ожидается на GFv2. – Raanan 2010-12-20 15:52:01

ответ

1

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

1

Вы имеете @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; 

Вместо того и другого.