2010-12-15 20 views
2

我有一個簡單的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 fileglassfish3 resultglassfish2 result

+0

你是說這個相同的代碼部署和GF V2按預期工作來解決? – Preston 2010-12-15 15:09:06

+0

是的,我添加了一個項目jar和在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; 

而是兩個。

+0

嗨, 謝謝您的回答, 我曾嘗試聲明它只在一個地方,無論是在包級別或屬性級別,但仍然 - 沒有運氣。它不起作用。 – Raanan 2010-12-19 08:41:01

+0

我建議爲這個問題輸入一個錯誤。這可以在這裏完成:http://java.net/jira/browse/JAX_WS – 2010-12-20 17:32:44

相關問題