2013-10-03 3 views
1

я реализовал рабочий веб-службы с помощью CXF (2.7.1) с WSDL & XSD, которые включают в себя, среди прочего, следующий тип:Почему этот элемент XSD проходит по умолчанию ValidationEventHandler?

<xs:simpleType name="SimpleIdType"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[A-Za-z0-9:\.\-]{20}"/> 
    </xs:restriction> 
</xs:simpleType> 

я истолковать это будет: Принимать только 20 строк символов которые содержат только буквенно-цифровые символы и ':', '.' и '-'.

Когда я отправляю сообщение SOAP моей веб-службе с соответствующим элементом, содержащим FAAAAAAAAAAAAAAAAAAA, служба, конечно, принимает корректно без каких-либо ошибок.

Однако, если я отправить идентичное сообщение SOAP с # вместо F (т.е. #AAAAAAAAAAAAAAAAAAA), служба по-прежнему принимает сообщение, без выдачи каких-либо ошибка проверки (немаршалинг или иным образом).

Почему?

Не является ли default ValidationEventHandler должен обрабатывать это путем выброса «Ошибка отмены отмены»?

ответ

0

я, наконец, нашел правильный ответ на этот CXF на основе случае.

CXF уже имеет встроенную схему проверки схемы выполнения. Он назван schema validation via configuration и единственное, чего не хватало в моем коде был XML, чтобы включить его, внутри уже существующего <jaxws:endpoint элемента в beans.xml AKA application-context.xml:

<jaxws:properties> 
    <entry key="schema-validation-enabled" value="true" /> 
</jaxws:properties> 

Это открытие стало возможным благодаря ответу на @Patrick ,

1

Модель JAXB (сгенерированная или ручная кодировка) не содержит всех метаданных из XML-схемы в своих аннотациях. Если вы хотите проверить все аспекты схемы, вы можете включить это, указав экземпляр Schema на Unmarshaller.

+0

Ничего себе. +1 уже. Я собираюсь подробно прочитать вашу статью и сообщить, что это сработало для меня. Правильно ли я понимаю, что это означает также установку моего собственного [ValidationEventHandler] (https://jaxb.java.net/jaxb20-ed/api/javax/xml/bind/ValidationEventHandler.html)? – Withheld

+0

ОК, я попытался реализовать ваше решение, но у меня нет 'main()' в [моем CXF-сгенерированном коде] (http://stackoverflow.com/q/19184721/1864054). [Где] (http://stackoverflow.com/q/19184721/1864054) подключаю код схемы и Unmarshaller? – Withheld

+0

Похоже, я приближаюсь к этому неправильно (потому что CXF участвует): Согласно [этому] (http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/wsdl_first_xmlbeans /), наличие файла конфигурации cxf.xml в пути к классам (и его содержимом) изменяет поведение CXF по умолчанию, что параметры сообщения не будут проверяться. Это сбивает с толку, потому что я могу определенно получить «ошибку unmarshaling» (по умолчанию!), Если я отправлю сообщение «?» вместо 'xs: timestamp' ... Что мне не хватает? – Withheld

Смежные вопросы