Как вы можете обрабатывать недопустимые типы перечислений с помощью JAXB? - PullRequest
1 голос
/ 02 октября 2009

Мы используем 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, и мы хотим удалить данные и проверить их. Конечно, возможно, я что-то упустил из документации по валидации.

1 Ответ

2 голосов
/ 02 октября 2009

Вы говорите, что используете JAXB для проверки данных, но вы описываете неожиданный результат только после демаршаллинга XML-документа. В JAXB проверка и демаршаллинг - это две разные и, возможно, независимые проблемы, поскольку вы можете использовать JAXB как минимум в трех разных режимах:

  • не подтверждено
  • подтвердить, сообщить об ошибках, но продолжить демаршаллинг
  • проверить и разбить на ошибки

Вы уверены, что вы включили проверку схемы на своем демаршаллере и что вы оцениваете потенциальные ошибки? Как это сделать, может отличаться в зависимости от того, используете ли вы JAXB 1.0 или 2.0, но в документации должно быть указано, как это сделать.

...