Валидация схемы Jaxb не происходит в исходящем сообщении с CXF 2.3.1

StackOverflow https://stackoverflow.com/questions/4609004

Вопрос

Использование 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, предоставляемые библиотеки. Вы всегда можете удалить их позже, если они не нужны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top