Ну, я нашел основную проблему: это должно быть "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
само по себе не может быть нулевым, но если get()
вызывается с ключом, которого нет на карте, он вернет ноль, и NullPointerException
будет сброшен при попытке JVM распаковать его.
Этот код немного неаккуратный; значение типа не проверяется, поэтому мы получаем это довольно загадочное сообщение.
Очевидно, я тогда посмотрел значение DatatypeConstants.DATETIME
и обнаружил ошибку в регистре.
Это также заставляет меня поверить, что я, вероятно, должен использовать что-то вроде:
@XmlSchemaType(name=DatatypeConstants.DATETIME)
public XmlGregorianCalendar getDate() {
return date;
}
Для дополнительной защиты , но эта константа - QName
, а не строка.