Проверка схемы JAXB не происходит в исходящем сообщении с CXF 2.3.1 - PullRequest
1 голос
/ 05 января 2011

Использование 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 указывается в аннотации в Impls.

Интересно, что входящие сообщения, не прошедшие проверку того же ограничения, блокируются цепью перехватчика во время демаршаллинга.

Я тестирую на WebLogic. Я также мог бы проверить на WebSphere необходимо.

Другие ошибки проверки XSD (например, отсутствующий обязательный элемент) перехватываются исходящим маршаллером.

Причина, по которой мы обновили 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.

1 Ответ

0 голосов
/ 08 января 2011

У меня были похожие проблемы (CXF 2.2.7), и я смог решить их, добавив атрибуты serviceName и endpointName в мое определение компонента <jaxws:client>.проверьте раздел «Настройка Spring-клиента (вариант 1)» здесь: https://cwiki.apache.org/CXF20DOC/jax-ws-configuration.html для получения дополнительной информации об атрибутах.

Примечание: у меня также определен атрибут wsdlLocation.Вероятно, это необходимо для CXF, чтобы найти XSD, используемые службой.

Вот пример того, что у меня есть:

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

...