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
Voulez-vous dire ce même code déploie et fonctionne comme prévu sur GF v2? – Preston
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