Валидация схемы Jaxb не происходит в исходящем сообщении с CXF 2.3.1
-
25-09-2019 - |
Вопрос
Использование CXF 2.3.1.
Сгенерированная Java от WSDL с использованием JAXB.
С использованием
<jaxws:properties>
<entry key="schema-validation-enabled" value="true" />
</jaxws:properties>
в конфигурации клиента.
Мой тест создает объект, который не удается в этом конкретном требовании WSDL:
<xsd:simpleType name="UUID.Content">
<xsd:annotation>
<xsd:documentation xml:lang="EN">
Universally Unique Identifier
</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:token">
<xsd:length value="36" />
<xsd:pattern
value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
</xsd:restriction>
</xsd:simpleType>
Тем не менее, сообщение маршаллировано и делает его в течение всей цепочки исходящей перехватывателя.
WSDL является односторонним: только входным.
WSDLLocation указывается в аннотации в имдрам.
Интересно, входящие сообщения, которые проваливают проверку этого же ограничения, заблокированы цепочкой перехватчика во время Monrarhalling.
Я тестирую на Weblogic. Я также мог бы проверить в WebSphere необходим.
Другие проверки проверки XSD (такие как отсутствующий необходимый элемент) попадают в исходящий Marshaller.
Причина, по которой мы обновились до CXF 2.3.1 с 2.2.6, заключались в том, что мы наблюдали подобные вопросы входящих вопросах входящих сообщений. В 2.3.1 полная проверка XSD возникает для входящих сообщений, но не для исходящих.
Вот ошибка в CXF:
https://issues.apache.org/jira/browse/cxf-3233.
Мы работали вокруг этого, используя org.springframework.xml.validation.xmlvalidator, чтобы подтвердить, перед отправкой сообщения в цепочку перехватчика CXF. Я надеюсь, что исправления, которые используют цепь перехватчика CXF. Однако я подозреваю, что это ошибка в CXF.
Решение
У меня были похожие проблемы (CXF 2.2.7) и смог решить ее, добавив serviceName
а также endpointName
атрибуты моему <jaxws:client>
определение бобов. Проверьте раздел «Настройка пружинного клиента (опция 1)» здесь: https://cwiki.apache.org/cxf20doc/jax-ws-configuration.html. Для получения дополнительной информации о атрибутах.
Примечание: у меня также есть wsdlLocation
атрибут определен также. Это, вероятно, необходимо для CXF находить XSDS, используемые сервисом.
Вот пример того, что у меня есть:
<jaxws:client id="client"
serviceClass="com.example.ServiceInterface"
address="http://example.com/endpoint"
wsdlLocation="WEB-INF/wsdl/SampleWSDLFile.wsdl"
serviceName="s:SampleService"
endpointName="s:SampleServicePort"
xmlns:s="http://www.example.com/some/namesapce">
...
</jaxws:client>
Я также заметил, когда у меня была эта проблема, вся схема была напечатана на мой файл журнала по org.apache.cxf.wsdl.EndpointReferenceUtils
Класс каждый раз, когда клиент был вызван. Это поведение ушло, когда я настроил мой клиентский боб, как то выше. Интересно, вы видите что-то подобное тоже ...
Еще одна деталь, которую я должен упомянуть, что у меня было много неожиданного поведения от CXF, когда я не использовал все предоставляемые CXF-библиотеки, изложенные в WHICH_JARS
файл. Я также попробую добавить их в сборку, поэтому они переопределяют любой сервер или Java, предоставляемые библиотеки. Вы всегда можете удалить их позже, если они не нужны.