2010-03-23 87 views
3

以下工作:XSD:datetime和的XMLGregorianCalendar導致NullPointerException異常

public Date getDate() { 
    return date; 
} 

,併產生類似:

<date>2010-03-23T17:43:50.879Z</date> 

而且我可以使用的XMLGregorianCalendar返回XSD:日期或XSD:時間類型細:

@XmlSchemaType(name="date") 
public XmlGregorianCalendar getDate() { 
    return date; 
} 

它產生類似於:

<date>2010-03-23</date> 

但試圖返回的xsd:日期時間,像這樣:

@XmlSchemaType(name="datetime") 
public XmlGregorianCalendar getDate() { 
    return date; 
} 

原因該堆棧跟蹤:

java.lang.NullPointerException 
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.checkXmlGregorianCalendarFieldRef(RuntimeBuiltinLeafInfoImpl.java:864) 
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.access$200(RuntimeBuiltinLeafInfoImpl.java:111) 
    at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$13.print(RuntimeBuiltinLeafInfoImpl.java:536) 
...snip... 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:619) 

沒有提及我的代碼在所有。

我使用Tomcat 6.0.24,JAVA 1.6.0_16-B01

回答

8

好吧,我發現的基本問題:它應該是"dateTime"沒有"datetime",但也有一些更深的方面來此。

首先,跟蹤給了我幫助的方式很少,我花了一段時間才能找到合適的源(jaxb-ri-2_2.src.zip)。 864線是這樣的:

int bitField = xmlGregorianCalendarFieldRef.get(type); 

xmlGregorianCalendarFieldRef被定義爲:

private static final Map<QName, Integer> xmlGregorianCalendarFieldRef = 
      new HashMap<QName, Integer>(); 
    static { 
      Map<QName, Integer> f = xmlGregorianCalendarFieldRef; 
      f.put(DatatypeConstants.DATETIME, 0x1111111); 
      f.put(DatatypeConstants.DATE,  0x1111000); 
      f.put(DatatypeConstants.TIME,  0x1000111); 
      f.put(DatatypeConstants.GDAY,  0x1001000); 
      f.put(DatatypeConstants.GMONTH,  0x1010000); 
      f.put(DatatypeConstants.GYEAR,  0x1100000); 
      f.put(DatatypeConstants.GYEARMONTH, 0x1110000); 
      f.put(DatatypeConstants.GMONTHDAY, 0x1011000); 
    } 

所以xmlGregorianCalendarFieldRef本身不能爲null,但如果get()是帶一個關鍵是不存在的地圖它將返回null,並且當JVM嘗試解除它時將拋出NullPointerException

此代碼是一個有點草率;類型值沒有被檢查,這就是爲什麼我們得到這個相當神祕的信息。

很顯然,我再擡頭的DatatypeConstants.DATETIME價值和發現的情況下錯誤。

這也使我相信,我也許應該使用類似:

@XmlSchemaType(name=DatatypeConstants.DATETIME) 
public XmlGregorianCalendar getDate() { 
    return date; 
} 

爲增加保護,該常量是QName不是字符串。

相關問題