1. 概要

以前、Springを使用してSOAPWebサービスを作成する方法を見てきました。

このチュートリアルでは、Springベースのクライアントを作成してこのWebサービスを利用する方法を学習します。

JavaでSOAPWebサービスを呼び出す場合、JAX-WSRIを使用して同じことを行いました。

2. Spring SOAP Webサービス–簡単な要約

以前、Springで、国のデータを取得するためのWebサービスをその名前で作成しました。 クライアントの実装について詳しく説明する前に、それをどのように行ったかを簡単に要約してみましょう。

コントラクトファーストのアプローチに従って、最初にドメインを定義するXMLスキーマファイルを作成しました。 次に、このXSDを使用して、 jaxb2-maven-plugin を使用して、要求、応答、およびデータモデルのクラスを生成しました。

その後、4つのクラスをコーディングしました。

最後に、SOAPリクエストを送信してcURL経由でテストしました。

次に、上記のブートアプリを実行してサーバーを起動し、次の手順に進みます。

3. クライアント

ここでは、 Springクライアントを構築して、上記のWebサービスを呼び出してテストします。

それでは、クライアントを作成するために必要なすべてのことを段階的に見ていきましょう。

3.1. クライアントコードを生成する

まず、 http:// localhost:8080 / ws/countries.wsdlで入手可能なWSDLを使用していくつかのクラスを生成します。これをダウンロードしてsrc/main/に保存します。 resourcesフォルダー。

Mavenを使用してコードを生成するには、maven-jaxb2-pluginをpom.xmlに追加します。

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.14.0</version>
    <executions>
         <execution>
              <goals>
                  <goal>generate</goal>
              </goals>
         </execution>
    </executions>
    <configuration>
          <schemaLanguage>WSDL</schemaLanguage>
          <generateDirectory>${project.basedir}/src/main/java</generateDirectory>
          <generatePackage>com.baeldung.springsoap.client.gen</generatePackage>
          <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
          <schemaIncludes>
             <include>countries.wsdl</include>
          </schemaIncludes>
    </configuration>
</plugin>

特に、プラグイン構成では次のように定義しました。

  • generateDirectory –生成されたアーティファクトが保存されるフォルダー
  • generatePackage –アーティファクトが使用するパッケージ名
  • schemaDirectoryおよびschemaIncludes –WSDLのディレクトリとファイル名

JAXB生成プロセスを実行するには、プロジェクトをビルドするだけでこのプラグインを実行します。

mvn compile

興味深いことに、ここで生成されるアーティファクトは、サービスに対して生成されるアーティファクトと同じです。

使用するものをリストアップしましょう。

  • Country.javaおよびCurrency.java –データモデルを表すPOJO
  • GetCountryRequest.java –リクエストタイプ
  • GetCountryResponse.java –応答タイプ

このサービスは世界中のどこにでもデプロイでき、WSDLだけで、サーバーと同じクラスをクライアント側で生成できました。

3.2. CountryClient

次に、Springの WebServiceGatewaySupport を拡張して、Webサービスと対話する必要があります。

このクラスをCountryClientと呼びます。

public class CountryClient extends WebServiceGatewaySupport {

    public GetCountryResponse getCountry(String country) {
        GetCountryRequest request = new GetCountryRequest();
        request.setName(country);

        GetCountryResponse response = (GetCountryResponse) getWebServiceTemplate()
          .marshalSendAndReceive(request);
        return response;
    }
}

ここでは、Webサービスが公開した操作に対応する単一のメソッドgetCountryを定義しました。 このメソッドでは、 GetCountryRequest インスタンスを作成し、Webサービスを呼び出してGetCountryResponseを取得しました。 つまり、ここでSOAP交換を実行しました。

ご覧のとおり、SpringはWebServiceTemplateを使用して呼び出しを非常に簡単にしました。 テンプレートのメソッドmarshalSendAndReceiveを使用して、SOAP交換を実行しました。

XML変換は、プラグインされたMarshaller。を介してここで処理されます。

次に、このMarshallerの構成を見てみましょう。

3.3. CountryClientConfig

SpringWSクライアントを構成するために必要なのは2つのBeanだけです。

まず、 Jaxb2Marshaller を使用してメッセージをXMLとの間で変換し、次に CountryClient を使用して、marshallerBeanに接続します。

@Configuration
public class CountryClientConfig {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.baeldung.springsoap.client.gen");
        return marshaller;
    }
    @Bean
    public CountryClient countryClient(Jaxb2Marshaller marshaller) {
        CountryClient client = new CountryClient();
        client.setDefaultUri("http://localhost:8080/ws");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }
}

ここで、marshallerのコンテキストパスがpom.xmlのプラグイン構成で指定されたgeneratePackageと同じであることに注意する必要があります。

ここで、クライアントのデフォルトURIにも注意してください。 これは、WSDLで指定された soap:addressの場所として設定されます。

4. クライアントのテスト

次に、JUnitテストを記述して、クライアントが期待どおりに機能していることを確認します。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class)
public class ClientLiveTest {

    @Autowired
    CountryClient client;

    @Test
    public void givenCountryService_whenCountryPoland_thenCapitalIsWarsaw() {
        GetCountryResponse response = client.getCountry("Poland");
        assertEquals("Warsaw", response.getCountry().getCapital());
    }

    @Test
    public void givenCountryService_whenCountrySpain_thenCurrencyEUR() {
        GetCountryResponse response = client.getCountry("Spain");
        assertEquals(Currency.EUR, response.getCountry().getCurrency());
    }
}

ご覧のとおり、CountryClientConfigで定義されたCountryClientBeanに配線しました。 次に、前述のように、getCountryを使用してリモートサービスを呼び出しました。

さらに、生成されたデータモデルPOJO、国、、および通貨を使用して、アサーションに必要な情報を抽出することができました。

5. 結論

このチュートリアルでは、 SpringWSを使用してSOAPWebサービスを呼び出す方法の基本を見ました。

SpringがSOAPWebサービス領域で提供するもののほんの一部にすぎません。 探索するロットがあります。

いつものように、ソースコードはGitHubから入手できます。