【Spring】WebServiceTemplateの使用方法

https://qiita.com/tki_ikt/items/ce94f8aa3736f8fe5e44

前回に続き、WebServiceTemplateの使用方法について。


# 目次
1. [WebServiceTemplateの場合](#Chapter1)
2. [補足](#Chapter2) 


<a id="#Chapter1"></a>
## WebServiceTemplateの場合


1. **依存関係の追加**: プロジェクトの依存関係に、Spring WebとSpring WSを追加。

   ```xml
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web-services</artifactId>
   </dependency>
   ```

2. **WebServiceTemplateの作成**: XMLとJavaオブジェクトの変換にはJAXB2マーシャラーを使用。


   ```java
   import org.springframework.context.annotation.Bean;
   import org.springframework.context.annotation.Configuration;
   import org.springframework.oxm.jaxb.Jaxb2Marshaller;
   import org.springframework.ws.client.core.WebServiceTemplate;

   @Configuration
   public class WebServiceConfig {
              
       @Bean
       public Jaxb2Marshaller marshaller() {
           Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
           //単一クラスをバインドする場合はsetClassesToBeBound()
           //特定パッケージ内のすべてのクラスをバインドする場合はsetContextPath()
           marshaller.setContextPath("com.example.model");
           return marshaller;
       }

       @Bean
       public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller) {
           WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
           webServiceTemplate.setMarshaller(marshaller);
           webServiceTemplate.setUnmarshaller(marshaller);
           return webServiceTemplate;
       }
   }
   ```


3. **Webサービスとの通信**: WebServiceTemplateを使用してWebサービスとの通信を行う。
marshalSendAndReceiveメソッドでリクエスト送信、レスポンスを受け取る。

   ```java
   @Service
   public class WebServiceClient {
       
       private final WebServiceTemplate webServiceTemplate;
       
       public WebServiceClient(WebServiceTemplate webServiceTemplate) {
           this.webServiceTemplate = webServiceTemplate;
       }
       
       public ResponseObject callWebService(RequestObject request) {
           //marshalSendAndReceiveメソッドを使用してリクエスト送信、レスポンスを受け取る。
           ResponseObject response = (ResponseObject) webServiceTemplate.marshalSendAndReceive(request);
           return response;
       }
   }
   ```

<a id="#Chapter2"></a>
## 補足

 - **WebServiceTemplateを複数作成する場合**
`@Bean`のname属性を使用して特定の名称を設定。
WebServiceTemplateを使用する際、`@Autowired`に`@Qualifier`アノテーションを併用して特定のBean名を指定することができる。

 - **WebServiceTemplateの設定について**
WebServiceTemplateでエンコードや接続時間に関する設定が可能。代表的な設定は下記の通り。

1. エンコーディング設定
 `setDefaultUriEncoding()`メソッドを使用して、リクエスト・レスポンスのエンコーディングを指定可能。UTF-8を使用する場合は下記の通り。

   ```java
   webServiceTemplate.setDefaultUriEncoding("UTF-8");
   ```

2. 接続設定
 タイムアウトや接続設定などをカスタマイズ可能。

    ```java
    import org.springframework.ws.transport.http.HttpComponentsMessageSender;

    // WebServiceTemplateの作成 - WebServiceTemplate内
    HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
    messageSender.setConnectTimeout(5000); // 接続タイムアウトの設定（ミリ秒）
    messageSender.setReadTimeout(10000); // 読み込みタイムアウトの設定（ミリ秒）

    webServiceTemplate.setMessageSender(messageSender);
    ```

`HttpComponentsMessageSender`を作成、`setConnectTimeout()`と`setReadTimeout()`で接続タイムアウト、読み込みタイムアウトを設定しsetMessageSenderでWebServiceTemplateに設定。




# 参考文献
- [Spring Framework Documentation](https://docs.spring.io/spring-framework/docs/current/reference/html/)
- [Spring Boot Documentation](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)