XSD:datetime和的XMLGregorianCalendar导致NullPointerException异常
问题描述:
以下工作: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
答
好吧,我发现的基本问题:它应该是"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
不是字符串。