Spring RestController

Spring RestControllerアノテーションは、それ自体が@Controller@ResponseBodyで注釈付けされている便利なアノテーションです。このアノテーションは、クラスに適用され、それをリクエストハンドラとしてマークします。Spring RestControllerアノテーションは、Spring MVCを使用してRESTful Webサービスを作成するために使用されます。Spring RestControllerは、リクエストデータを定義されたリクエストハンドラメソッドにマッピングすることを担当します。ハンドラメソッドからレスポンスボディが生成されると、それをJSONまたはXMLレスポンスに変換します。

Spring RestControllerの例

SpringでREST Webサービスを簡単に作成する方法を見てみましょう。Springリポジトリの実装を再利用し、RESTful Webサービスを作成します。ここでは独立したWebアプリケーションを作成し、Spring Bootは使用しません。また、APIをJSONとXMLの両方をリクエストおよびレスポンスでサポートするように公開します。以下の画像は、最終的なプロジェクト構造を示しています。モデルとリポジトリクラスは、すでにSpringリポジトリのチュートリアルで提供されています。ここでは、RestControllerの実装に重点を置きます。

Spring RestController Mavenの依存関係

Spring RestControllerのサンプルプロジェクトを作成するために必要な依存関係を見てみましょう。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>5.0.7.RELEASE</version>
</dependency>

<!-- Jackson for REST JSON Support -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.6</version>
</dependency>
<!-- JAXB for XML Response, needed to explicitly define from Java 9 onwards -->
<dependency>
	<groupId>javax.xml.bind</groupId>
	<artifactId>jaxb-api</artifactId>
	<version>2.3.0</version>
</dependency>
<dependency>
	<groupId>org.glassfish.jaxb</groupId>
	<artifactId>jaxb-runtime</artifactId>
	<version>2.3.0</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>javax.activation</groupId>
	<artifactId>javax.activation-api</artifactId>
	<version>1.2.0</version>
</dependency>

私たちのREST WebサービスからのXMLとJSONのリクエストとレスポンスをサポートするために、Spring MVC、Jackson、およびJAXBライブラリが必要です。web.xmlファイルは、Spring MVC DispatcherServletをフロントコントローラーとして設定するために使用されます。次に、Springコンテキストファイルを見てみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
	xmlns="https://www.springframework.org/schema/mvc"
	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="https://www.springframework.org/schema/beans"
	xmlns:context="https://www.springframework.org/schema/context"
	xsi:schemaLocation="https://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<context:component-scan
		base-package="com.journaldev.spring" />

	<beans:bean id="jsonMessageConverter"
		class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
	<beans:bean id="xmlMessageConverter"
		class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />

	<beans:bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<beans:property name="messageConverters">
			<beans:list>
				<beans:ref bean="jsonMessageConverter" />
				<beans:ref bean="xmlMessageConverter" />
			</beans:list>
		</beans:property>
	</beans:bean>

</beans:beans>

最も重要な部分は、jsonMessageConverterおよびxmlMessageConverterのbeanがRequestMappingHandlerAdaptermessageConvertersプロパティに定義および設定されていることです。これだけで、Springに私たちのアプリケーションがJSONとXMLの両方をサポートすることを伝える必要があり、これらが変換に使用されるbeanです。

Spring RestControllerクラス

こちらが当社のSpring RestControllerクラスの実装です。

package com.journaldev.spring.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.journaldev.spring.model.Employee;
import com.journaldev.spring.repository.EmployeeRepository;

@RestController
public class EmployeeRestController {

	@Autowired
	private EmployeeRepository repository;
	
	@GetMapping("/rest/employee/get/{id}")
	public Employee getEmployeeByID(@PathVariable("id") int id) {
		return repository.retrieve(id);
	}
	
	@GetMapping("/rest/employee/getAll")
	//返すものがリストの場合、JSONレスポンスのみがサポートされています
	//XMLが必要な場合は、EmployeeListなどのラッパークラスを追加してルートXML要素にします
	public List getAllEmployees() {
		return repository.getAll();
	}

	@PostMapping("/rest/employee/create")
	public Employee createEmployee(@RequestBody Employee emp) {
		repository.store(emp);
		return emp;
	}
	
	@GetMapping("/rest/employee/search/{name}")
	public Employee getEmployeeByName(@PathVariable("name") String name) {
		return repository.search(name);
	}
	
	@DeleteMapping("/rest/employee/delete/{id}")
	public Employee deleteEmployeeByID(@PathVariable("id") int id) {
		return repository.delete(id);
	}
}

注意してください。ここでは、私たちのREST APIのみを定義しており、すべてのビジネスロジックはRepositoryクラスの一部です。もし私たちのメソッドがリストまたは配列を返す場合、SpringはJSONレスポンスのみをサポートします。なぜならXMLのルート要素は匿名にできないが、JSONはできるからです。リストをXMLとして返すことをサポートしたい場合、ラッパークラスを作成してこのリストを保持し、それを返す必要があります。私たちはいくつかのメソッドでリクエストとしてEmployeeオブジェクトを期待していますが、Springはリクエストボディを解析し、これらのメソッドのためにEmployeeオブジェクトに変換する処理をします。同様に、我々はEmployeeオブジェクトをレスポンスボディとして返していますが、再びSpringがJSON/XMLレスポンスに変換する処理をします。

受け入れとコンテンツタイプのリクエストヘッダー

私たちは私たちのRESTアプリケーションをXMLとJSONの両方で動作するように構成しています。では、どのようにしてリクエストがXMLかJSONかを知ることができるでしょうか。そして、レスポンスはJSONまたはXML形式で送信する必要がありますか。これは、AcceptContent-Typeリクエストヘッダーが使用される場所です。Content-Type:リクエストボディのコンテンツタイプを定義します。その値が「application/xml」である場合、SpringはリクエストボディをXMLドキュメントとして扱います。その値が「application/json」である場合、リクエストボディはJSONとして扱われます。Accept:クライアントがレスポンスとして期待しているコンテンツのタイプを定義します。その値が「application/xml」である場合、XMLレスポンスが送信されます。その値が「application/json」である場合、JSONレスポンスが送信されます。

Spring RestController テスト

アプリケーションはテストの準備ができています。Tomcat-9にデプロイし、Postmanでテストしています。以下は説明付きのテスト結果です。

Spring RestController GET JSON レスポンス

シンプルなGETリクエストで、重要なポイントは「Accept」ヘッダーの値です。

Spring RestController GET XML レスポンス

「Accept」ヘッダーの値を「application/xml」に変更すると、XMLレスポンスを取得します。

Spring RestController GET リスト

「APIを呼び出して従業員のリストを取得しましょう。 JSON形式で匿名のルート要素で要素のリストを取得しています。 XMLは匿名のルート要素をサポートしていないため、例外メッセージが発生しています。

Spring RestController POST

Spring RestController POST with JSON Request and Response Spring RestController POST with JSON Request Body Spring RestController POST with JSON Request and XML Response

Spring RestController DELETE

サマリー

Spring RestControllerは、RESTウェブサービスAPIを作成するためのあらゆる雛形作成作業をお手伝いし、ビジネスロジックに焦点を当てるのに役立ちます。

プロジェクト全体は、GitHubリポジトリからダウンロードできます。

Source:
https://www.digitalocean.com/community/tutorials/spring-restcontroller