Web サービス

Spring Boot は Web サービスの自動構成を提供するため、必要なのは @Endpoint (Javadoc) Bean を定義することだけです。

Spring Web Services の機能は、spring-boot-starter-webservices モジュールで簡単にアクセスできます。

SimpleWsdl11Definition (Javadoc) および SimpleXsdSchema (Javadoc) Bean は、それぞれ WSDL および XSD に対して自動的に作成されます。これを行うには、次の例に示すように、それらの場所を構成します。

  • プロパティ

  • YAML

spring.webservices.wsdl-locations=classpath:/wsdl
spring:
  webservices:
    wsdl-locations: "classpath:/wsdl"

WebServiceTemplate を使用した Web サービスの呼び出し

アプリケーションから リモート Web サービスを呼び出す必要がある場合は、WebServiceTemplate クラスを使用できます。WebServiceTemplate (Javadoc) インスタンスは使用前にカスタマイズする必要があることが多いため、Spring Boot は単一の自動構成された WebServiceTemplate (Javadoc) Bean を提供しません。ただし、必要に応じて WebServiceTemplate (Javadoc) インスタンスを作成するために使用できる WebServiceTemplateBuilder (Javadoc) は自動構成されます。

次のコードは典型的な例を示しています。

  • Java

  • Kotlin

import org.springframework.boot.webservices.client.WebServiceTemplateBuilder;
import org.springframework.stereotype.Service;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.soap.client.core.SoapActionCallback;

@Service
public class MyService {

	private final WebServiceTemplate webServiceTemplate;

	public MyService(WebServiceTemplateBuilder webServiceTemplateBuilder) {
		this.webServiceTemplate = webServiceTemplateBuilder.build();
	}

	public SomeResponse someWsCall(SomeRequest detailsReq) {
		return (SomeResponse) this.webServiceTemplate.marshalSendAndReceive(detailsReq,
				new SoapActionCallback("https://ws.example.com/action"));
	}

}
import org.springframework.boot.webservices.client.WebServiceTemplateBuilder
import org.springframework.stereotype.Service
import org.springframework.ws.client.core.WebServiceTemplate
import org.springframework.ws.soap.client.core.SoapActionCallback

@Service
class MyService(webServiceTemplateBuilder: WebServiceTemplateBuilder) {

	private val webServiceTemplate: WebServiceTemplate

	init {
		webServiceTemplate = webServiceTemplateBuilder.build()
	}

	fun someWsCall(detailsReq: SomeRequest?): SomeResponse {
		return webServiceTemplate.marshalSendAndReceive(
			detailsReq,
			SoapActionCallback("https://ws.example.com/action")
		) as SomeResponse
	}

}

デフォルトでは、WebServiceTemplateBuilder (Javadoc) はクラスパス上の利用可能な HTTP クライアントライブラリを使用して、適切な HTTP ベースの WebServiceMessageSender (Javadoc) を検出します。次のように、個々のビルダーの読み取りおよび接続タイムアウトをカスタマイズすることもできます。

  • Java

  • Kotlin

import java.time.Duration;

import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
import org.springframework.boot.webservices.client.WebServiceMessageSenderFactory;
import org.springframework.boot.webservices.client.WebServiceTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ws.client.core.WebServiceTemplate;

@Configuration(proxyBeanMethods = false)
public class MyWebServiceTemplateConfiguration {

	@Bean
	public WebServiceTemplate webServiceTemplate(WebServiceTemplateBuilder builder) {
		ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.defaults()
			.withConnectTimeout(Duration.ofSeconds(2))
			.withReadTimeout(Duration.ofSeconds(2));
		builder.httpMessageSenderFactory(WebServiceMessageSenderFactory.http(settings));
		return builder.build();
	}

}
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings
import org.springframework.boot.webservices.client.WebServiceMessageSenderFactory
import org.springframework.boot.webservices.client.WebServiceTemplateBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.ws.client.core.WebServiceTemplate
import java.time.Duration

@Configuration(proxyBeanMethods = false)
class MyWebServiceTemplateConfiguration {

	@Bean
	fun webServiceTemplate(builder: WebServiceTemplateBuilder): WebServiceTemplate {
		val settings = ClientHttpRequestFactorySettings.defaults()
				.withConnectTimeout(Duration.ofSeconds(2))
				.withReadTimeout(Duration.ofSeconds(2))
		builder.httpMessageSenderFactory(WebServiceMessageSenderFactory.http(settings))
		return builder.build()
	}

}
特定のテンプレートのカスタマイズコードが適用されていない場合は、使用されるグローバル HTTP クライアント構成を変更することもできます。