Мы используем JAXB для обработки нашей валидации wsdl. В wsdl у нас есть перечисление примерно так:
<xs:simpleType name="myEnum">
<xs:annotation>
<xs:documentation>The enums which matter.</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="MYENUM_1">
<xs:annotation>
<xs:documentation>MYENUM_1 is the first enum.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="MYENUM_2">
<xs:annotation>
<xs:documentation>MYENUM_2 is the second enum.</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
Если мы передадим недопустимую строку в качестве перечисления, например, MYENUM_7, значение будет равно нулю вместо того, чтобы выдавать ошибку, как мы и ожидали. Копаясь в коде, мы находим следующее из RuntimeEnumLeafInfoImpl.java:
package com.sun.xml.bind.v2.model.impl;
//...
public T parse(CharSequence lexical) throws AccessorException, SAXException {
// TODO: error handling
B b = baseXducer.parse(lexical);
if(b==null) {
return null;
}
return parseMap.get(b);
}
Понятно, что parseMap - это наш список перечислений, но если ключ к карте, в данном случае значение b, отсутствует на карте, он просто возвращает ноль. Мы бы хотели, чтобы он выбрасывал и какое-то исключение, если b не в parseMap.
Если не исправить это и перекомпилировать наш собственный JAXB, есть ли другой способ решить эту проблему?
РЕДАКТИРОВАТЬ: для уточнения
Мы используем JAXB 2.1.9, и мы хотим удалить данные и проверить их. Конечно, возможно, я что-то упустил из документации по валидации.