2011-04-25 49 views
7

我有一些問題將我的Java數據類型映射到標準架構日期數據類型。將Java日期對象映射到XML架構日期時間格式

我有一個簡單的類,我這樣註釋。句點實例變量是Java Date對象類型。

@XmlAccessorType(value = XmlAccessType.NONE) 
public class Chart { 
    @XmlElement 
    private double amount; 
    @XmlElement 
    private double amountDue; 
    @XmlElement 
    private Date period; 
    //constructor getters and setters 
} 

這裏是我的Web服務

@WebService 
public class ChartFacade { 
    @WebMethod 
    public Chart getChart() throws ParseException { 
     SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd"); 
     Chart chart = new Chart(20.0,20.5, df.parse("2001-01-01")); 
     return chart; 
    } 
} 

我的問題是,它的格式不能按照我所期待返回最新數據。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns2:getChartResponse xmlns:ns2="http://ss.ugbu.oracle.com/"> 
     <return> 
      <amount>20.0</amount> 
      <amountDue>20.5</amountDue> 
      **<period>2001-01-01T00:01:00+08:00</period>** 
     </return> 
     </ns2:getChartResponse> 
    </S:Body> 
</S:Envelope> 

我想週期單元要返回這樣

<period>2001-01-01</period> 

有沒有什麼辦法可以做到這一點?

回答

8

您可以執行以下操作來控制的架構類型:

@XmlElement 
@XmlSchemaType(name="date") 
private Date period; 

更多信息:

+0

如何在這種情況下將xml日期格式化爲yyyy-MM-dd? – 2011-04-25 14:37:55

+0

@road到yamburg - yyyy-MM-dd是xsd:date的格式,它在@XmlSchemaType註釋中指定。 – 2011-04-25 14:54:30

+0

很高興知道,謝謝,但您能否指出我所說的文檔?我查看了http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlSchemaType.html,它沒有提及任何格式。 – 2011-04-25 15:26:04

0

您的Chart構造函數似乎將格式化的日期字符串解析回Date,然後使用默認格式序列化爲XML響應。 我想用private String period;(和固定的構造函數)應該工作

+0

感謝您的幫助。我認爲你的建議可行,但來自數據庫的數據實際上是一個Date對象,並且此類處理映射。如果我將其轉換爲字符串,那麼我可能不得不重新編譯其他代碼。請任何其他想法? – 2011-04-25 06:52:23

+0

@ road to yamburgs答案好多了。 upvoting – qwerty 2011-04-25 07:05:19

7

使用@XmlJavaTypeAdapter註釋,你可以元帥/解組的田野上你想要的任何方式。

不能說,如果這是最簡單的方法。

另請注意,它可能會損害與任何試圖使用您的WSDL的代碼的互操作性。其他代碼的程序員會將xsd:string視爲字段類型,因此必須手動執行格式設置和解析(就像您一樣,是的),介紹誰知道有多少錯誤。所以請考慮一下xsd:真的是一個不錯的選擇。

被盜從here

@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class) 
Date someDate; 
... 

public class DateAdapter extends XmlAdapter<String, Date> { 

    // the desired format 
    private String pattern = "MM/dd/yyyy"; 

    public String marshal(Date date) throws Exception { 
     return new SimpleDateFormat(pattern).format(date); 
    } 

    public Date unmarshal(String dateString) throws Exception { 
     return new SimpleDateFormat(pattern).parse(dateString); 
    } 
} 

UPDATE:如被@Blaise Doughan提到的,更短的方法是用

@XmlSchemaType("date") 
Date someDate; 

標註的日期儘管它仍然是不明確爲什麼時區信息不是在日期生成的,這個代碼在實際工作中需要少得多的輸入。

+0

一個可能的解決方案。+1 – 2011-04-25 06:57:52

+0

僅供參考,JAXB的@XmlSchemaType(「date」)可以用於此用例:http://stackoverflow.com/questions/5775860/mapping-java-date-object-to-xml-schema-datetime-format/5776970#5776970 – 2011-04-25 09:25:27

相關問題