2010-12-15 93 views
2

J'ai une méthode de service Web simple qui renvoie une classe java simple comme valeur de retour.Comment sérialiser java.sql.Date aussi longtemps, lors de l'utilisation de services Web?

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

Je veux que java.sql.Date sera transmis en tant que valeur à long dans le fichier XML (parce que le client est J2ME qui ne peut pas gérer les choses complexes). Pour ce but j'ai pris la solution qui a été mentionnée dans de nombreux endroits auparavant, et j'ai beaucoup travaillé sur Glassfish v2.

D'abord, je déclare l'adaptateur suivant:

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

Ensuite, je déclare son utilisation dans le paquet-info fichier comme ceci:

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

Le problème se produit sur GlassFish 3. La date est transmis en tant que valeur "xs: dateTime", au lieu de Long, bien que j'ai défini l'adaptateur correctement. Ce est la réponse que je reçois du serveur GlassFish 3, quand je l'appelle mon service web:

<?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> 

J'ai aussi vérifié avec le débogueur - les fonctions de l'adaptateur ne sont jamais appelés. D'autre part, l'adaptateur n'est pas inutile, car si j'essaie de le supprimer, j'obtiens l'exception JAXB, me disant que java.sql.Date ne peut pas être manipulé car il n'a pas de constructeur sans-arg.

Des idées?

20/12/2010 - j'ai ajouté des liens vers un pot de projet avec les sources et les résultats pour glassfish2 et glassfish3:
jar file, glassfish3 result, glassfish2 result

+0

Voulez-vous dire ce même code déploie et fonctionne comme prévu sur GF v2? – Preston

+0

Oui, j'ai ajouté un pot de projet et des résultats détaillés pour fonctionner sur GFv2 & 3. Cela fonctionne comme prévu sur GFv2. – Raanan

Répondre

1

J'ai posté un bug pour cette question, il devrait être résolu sur la version 3,1 (link)

1

Vous avez le @XmlJavaTypeAdapter déclaré à la fois au niveau de la propriété et le niveau du paquet. Avez-vous essayé de le déclarer en un seul endroit?

Soit:

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

Ou:

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

au lieu des deux.

+0

Salut, Merci pour votre réponse, J'ai essayé de le déclarer seulement dans un endroit, soit au niveau du paquet ou au niveau de la propriété, mais encore - pas de chance. Ça ne marche pas. – Raanan

+0

Je suggère d'entrer un bug pour ce problème. Cela peut être fait ici: http://java.net/jira/browse/JAX_WS –