CXFとアウトバウンドのメッセージで発生していないJAXBスキーマ検証2.3.1
-
25-09-2019 - |
質問
CXF 2.3.1を使用します。
JAXBを使用したWSDLからJavaを生成します。
タグを使用して
<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検証の失敗は、発信マーシャラーによって捕捉されています。
私たちは2.2.6からCXF 2.3.1にアップグレードする理由は、我々が受信メッセージに同様の問題を見ていたということでした。 2.3.1では、完全なXSD検証は、インバウンドメッセージのためではなく、アウトバウンドのもののために発生します。
ここCXFでのバグがあります:
https://issues.apache.org/jira/browse/CXF-3233
私たちはCXFインターセプターチェーンにメッセージを送信する前に検証するためにorg.springframework.xml.validation.XmlValidatorを使用することによって、これを回避しました。私はCXFインターセプターのチェーンを使用して修正するために願っています。しかし、私はこれはCXFのバグであることを疑うます。
解決
私は同様の問題(CXF 2.2.7)を持っていたし、私のserviceName
のBean定義にendpointName
と<jaxws:client>
属性を追加することによって、それを解決することができましたしました。 ます。https:ここでは、「春のクライアント(オプション1)の設定」セクションをチェックアウト/ /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
クラスによって私のログファイルクライアントが呼び出されたたびに印刷された気づきました。この動作は、離れて行ったとき、私はセットアップ上記のような私のクライアントBeanを。あなたもそのような何かを見ているのかしら...
私は言及すべきもう一つの詳細は、私がWHICH_JARS
ファイルに記載されているすべてのCXFが提供するライブラリを使用していないときに私はCXFからの予期しない動作の多くを持っていたということです。彼らは、任意のサーバーまたはJavaのライブラリを提供を上書きするので、私はまた、ビルドに追加しようとするだろう。彼らは必要ない場合は、いつでも、後でそれらを削除することができます。