2010-12-15 6 views
2

Ich habe eine einfache Web-Service-Methode, die eine einfache Java-Klasse als Rückgabewert zurückgibt.Wie serialisiert man java.sql.Date als Long, wenn man Web Services benutzt?

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

Ich mag, dass java.sql.Date als Long-Wert in der XML übertragen wird (da die Client J2ME ist, die nicht komplexe Dinge verarbeiten kann). Für dieses puprpose nahm ich die Lösung, die an vielen Stellen zuvor erwähnt wurde, und arbeitete großartig auf Glassfish v2.

Zuerst erkläre ich den folgenden Adapter:

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

Dann erkläre ich seine Verwendung in Paket-info-Datei wie folgt:

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

Das Problem tritt auf Glassfish 3. Das Datum ist übertragen als "xs: dateTime" Wert, anstelle von Long, obwohl ich den Adapter richtig definiert. Diese ist die Antwort, die ich von Glassfish 3-Server erhalten, wenn ich meinen Web-Service anrufen:

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

ich auch mit dem Debugger überprüft - die Funktionen im Adapter werden nie genannt. Auf der anderen Seite ist der Adapater nicht nutzlos, denn wenn ich versuche, es zu entfernen, bekomme ich JAXB-Ausnahme, sagt mir, dass java.sql.Date kann nicht behandelt werden, da es keinen Arg-Konstruktor hat.

Irgendwelche Ideen?

20.12.2010 - Ich habe Links zu einem Projekt Glas mit Quellen und die Ergebnisse für glassfish2 und glassfish3:
jar file, glassfish3 result, glassfish2 result

+0

Sagst du das gleiche Code setzt und arbeitet als auf GF v2 erwartet? – Preston

+0

Ja, ich habe ein Projekt-Jar und detaillierte Ergebnisse für das Ausführen auf GFv2 & 3 hinzugefügt. Es funktioniert wie erwartet auf GFv2. – Raanan

Antwort

1

ich einen Fehler für dieses Problem geschrieben haben, sollte es 3,1 (link) auf Version gelöst werden

1

Sie haben die @XmlJavaTypeAdapter bei erklärt sowohl der Objektebene und das Paketniveau. Haben Sie versucht, es nur an einer Stelle zu deklarieren?

Entweder:

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

Oder:

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

Statt beide.

+0

Hallo, Vielen Dank für Ihre Antwort, Ich habe versucht, es nur an einem Ort, entweder in Paket-Ebene oder auf Eigentumsebene, aber immer noch - kein Glück. Es funktioniert nicht. – Raanan

+0

Ich würde vorschlagen, einen Fehler für dieses Problem einzugeben. Dies kann hier gemacht werden: http://java.net/jira/browse/JAX_WS –