В настоящее время я разрабатываю несколько веб-сервисов с использованием эталонной реализации JAX-WS (версия 2.1.7). Они основаны на контрактах, то есть файлы WSDL и XSD не создаются wsgen.
Это позволяет мне свободно использовать ограничения XSD для усиления проверки значений, передаваемых в мои службы через сообщения SOAP. Вот два примера таких «ограниченных» элементов XSD:
<xsd:element name="maxResults" minOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:minInclusive value="1"/>
<xsd:maxInclusive value="1000"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="lastName" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="25"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Я добавил аннотацию @SchemaValidation
к своим классам обслуживания, чтобы обеспечить проверку схемы. Однако JAX-WS не применяет правила проверки, как ожидалось. Поведение выглядит следующим образом:
- Об отсутствующих обязательных элементах сообщается правильно (например, отсутствует
maxResults
). - Недействительные значения (например, символьные данные в целочисленном поле) также сообщаются правильно.
- Нарушения ограничения интервала (например,
maxResults
> 1000 илиmaxResults
‹1) проходят процесс проверки без сообщения и вводятся в мои JAXB-сгенерированные структуры Java. Даже отрицательные значения считаются действительными, несмотря на типxsd:positiveInteger
! - Нарушения ограничения длины строки (например, длина
lastName
более 25 символов) также не сообщаются.
Другими словами, ограничения, которые появляются в тегах <xsd:element>
, применяются правильно, но элементы <xsd:restriction>
, похоже, полностью игнорируются JAXB при использовании в контексте на основе JAX-WS.
Я написал тестовый класс для проверки моих ограничений XSD с использованием чистого JAXB (без JAX-WS). В результате все ограничения соблюдаются правильно.
Это дает мне ощущение, что может быть ошибка в использовании JAXB JAX-WS ... если, конечно, я не что-то делаю неправильно ...
Я что-то принципиальное не упустил?!?
Заранее благодарю за любую помощь,
Джефф