春のRestController
Spring RestControllerアノテーションは、@Controllerと@ResponseBodyで自体がアノテーションされている便利なアノテーションです。このアノテーションは、クラスに適用され、それをリクエストハンドラとしてマークします。Spring RestControllerアノテーションは、Spring MVCを使用してRESTfulなWebサービスを作成するために使用されます。Spring RestControllerは、リクエストデータを定義されたリクエストハンドラメソッドにマッピングするのを担当します。ハンドラメソッドから生成されたレスポンスボディが生成されると、それをJSONまたはXMLレスポンスに変換します。
スプリングのRestControllerの例
春の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ウェブサービスからの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.scdev.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がRequestMappingHandlerAdapterのmessageConvertersプロパティに定義および設定されていることです。これだけで、Springに私たちのアプリケーションがJSONとXMLの両方をサポートすることを伝え、変換に使用するBeanであることを示すために必要です。
春のRestControllerクラス
私たちのSpring RestControllerクラスの実装はこちらです。
package com.scdev.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.scdev.spring.model.Employee;
import com.scdev.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")
//Returning is List is supported with JSON response only
//If you want XML, then add a wrapper class as Root XML element, for example EmployeeList
public List<Employee> 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オブジェクトに変換する処理を担当します。同様に、Response BodyとしてEmployeeオブジェクトを返しますが、再びSpringがJSON/XMLレスポンスに変換する処理を担当します。
受け入れおよびContent-Typeのリクエストヘッダーを受け入れる
RESTアプリケーションをXMLとJSONの両方で動作するように設定しました。だから、それはリクエストがXMLかJSONかをどのように知るのでしょうか。そして、レスポンスはJSON形式かXML形式で送信する必要があるのでしょうか。それには、AcceptとContent-Typeのリクエストヘッダが使用されます。Content-Typeは、リクエストボディのコンテンツタイプを定義します。値が「application/xml」の場合、SpringはリクエストボディをXMLドキュメントとして扱います。値が「application/json」の場合、リクエストボディはJSONとして扱われます。Acceptは、クライアントが受け取る予定のコンテンツのタイプを定義します。値が「application/xml」の場合、XMLレスポンスが送信されます。値が「application/json」の場合、JSONレスポンスが送信されます。
春のRestControllerテスト
私たちのアプリケーションはテストの準備が整っています。私はTomcat-9にデプロイして、Postmanでテストしています。以下はテスト結果と説明です。
SpringのRestControllerによるJSONレスポンスを取得
「SpringのRestControllerでGETメソッドでXML形式のレスポンスを取得する」
春のRestControllerにGETリストを取得する。
春のRestControllerでのPOST
Spring FrameworkのRestController DELETE
要約: この要約では、日本語でネイティブな言い方で以下を再表現します。
SpringのRestControllerは、RESTウェブサービスのAPIを作成するための煩雑な手続きを全て処理してくれることで、私たちがビジネスロジックに集中するのをサポートしてくれます。
私たちのGitHubリポジトリからプロジェクト全体をダウンロードできます。