2

次のようなディレクトリにスキーマがあるSpringWebサービスがあります。

  • WebRoot / DataContract / person.xsd
  • WebRoot / DataContract / sub-person.xsd

sub-person.xsdがperson.xsdに含まれている場合、次のようになります。

Person.xsd:

<xsd:import     namespace="http://www.mynamespace.org/xml/sub-person" 
                schemaLocation="sub-person.xsd"/>

私はwsdlを次のように定義しました:

<bean id="personserv" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">   
  <property name="schemaCollection" ref="schemaCollection"/>                                               
  <property name="portTypeName" value="personserv"/>                                
  <property name="locationUri" value="/ws/personnelService/"/>                              
  <property name="targetNamespace" value="http://www.mynamespace.org/definitions"/>       
</bean>

次を使用してwsdlファイルにアクセスできます。

http:// localhost:8080 / myapp / ws / personalService / personserv.wsdl

ただし、このwsdlを使用すると、クライアントはperson.xsdをフェッチでき、sub-person.xsdをフェッチできず、ロードに失敗したというエラーが発生します。

http:// localhost:8080 / myapp / ws / personalService / sub-person.xsd

私の質問は、そのURIの場所でsub-person.xsdを利用できるようにするにはどうすればよいですか?

また、person.xsdで指定されている場所を次のように変更しました。

<xsd:import     namespace="http://www.mynamespace.org/xml/sub-person" 
                schemaLocation="/DataContract/sub-person.xsd"/>

次に、クライアントは次の場所でsub-person.xsdを見つけようとしました。

http:// localhost:8080/sub-person.xsdこれは正しくありません。

別の試みは:

<xsd:import     namespace="http://www.mynamespace.org/xml/sub-person" 
                schemaLocation="DataContract/sub-person.xsd"/>

次に、クライアントは次の場所でsub-person.xsdを見つけようとしました。

http:// localhost:8080 / myapp / ws / personalService / DataContract / sub-person.xsd

4

1 に答える 1

1

Spring-WSには、Apache XML Commonsプロジェクトを利用して、これを処理するための非常に優れた機能があります。

<bean id="schemaCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
    <property name="xsds">
        <list>
            <value>/DataContract/person.xsd</value>
            <value>/DataContract/sub-person.xsd</value>
        </list>
    </property>
    <property name="inline" value="true"/>
</bean>

プロパティはキーです。各スキーマファイルを読み込み、一方から他方への参照inlineが見つかるとimport、参照を参照ファイルのコンテンツに置き換えます。include

これにより、WSDL生成コントローラーの出力は、サーバー上でさまざまなスキーマファイルを分離したまま、すべてのスキーマ情報がインライン化された単一のファイルになります。参照がないため、クライアントが参照を追跡して適切に解決できるかどうかを心配する必要はありません。

于 2010-03-04T13:36:51.710 に答える