我有一個簡單的Web服務方法,返回一個簡單的Java類作爲返回值。如何在使用Web服務時將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中作爲Long值傳遞(因爲客戶端是無法處理複雜事物的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服務器獲得響應,當我打電話給我的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>
我也與調試檢查 - 在適配器的功能不會被調用。 另一方面,adapater不是無用的,因爲如果我嘗試刪除它,我會得到JAXB異常, 告訴我java.sql.Date無法處理,因爲它沒有無參數構造函數。
任何想法?
20/12/2010 - 我添加鏈接到與源項目JAR和結果glassfish2和glassfish3:
jar file,glassfish3 result,glassfish2 result
你是說這個相同的代碼部署和GF V2按預期工作來解決? – Preston 2010-12-15 15:09:06
是的,我添加了一個項目jar和在GFv2&3上運行的詳細結果。它在GFv2上按預期工作。 – Raanan 2010-12-20 15:52:01