Spring RestController

Аннотация Spring RestController – это удобная аннотация, которая сама по себе аннотирована @Controller и @ResponseBody. Эта аннотация применяется к классу, чтобы пометить его как обработчик запросов. Аннотация Spring RestController используется для создания RESTful веб-сервисов с использованием Spring MVC. Spring RestController отвечает за сопоставление данных запроса с определенным методом обработчика запросов. После того, как тело ответа сгенерировано из метода обработчика, оно преобразуется в ответ JSON или XML.

Пример Spring RestController

Давайте посмотрим, как легко мы можем использовать RestController для создания RESTful веб-сервиса в Spring. Мы будем использовать реализацию Spring Repository и создадим restful веб-сервис. Мы создадим отдельное веб-приложение и не будем использовать здесь Spring Boot. Мы также предоставим наши API для поддержки JSON и XML в запросе и ответе. Ниже показана структура нашего конечного проекта. Модель и классы репозитория уже предоставлены в руководстве Spring Repository. Мы сосредоточимся больше на реализации RestController здесь.

Весенние зависимости Maven RestController Spring

Давайте рассмотрим зависимости, необходимые для создания нашего примера проекта 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>

Нам нужны библиотеки Spring MVC, Jackson и JAXB для поддержки запросов и ответов как в формате XML, так и в формате JSON от нашего веб-сервиса REST. Файл web.xml используется для настройки DispatcherServlet Spring MVC в качестве фронт-контроллера. Теперь давайте посмотрим на файл контекста 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, определенные и установленные в свойстве messageConverters RequestMappingHandlerAdapter. Этого достаточно, чтобы сказать Spring, что мы хотим, чтобы наше приложение поддерживало как JSON, так и XML, и эти бины должны использоваться для преобразования.

Класс RestController Spring

Вот реализация нашего класса RestController Spring.

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, то добавьте обертывающий класс в качестве корневого элемента XML, например EmployeeList
	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 ответ.

Заголовки запроса Accept и 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-ответ.

Тестирование 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 с JSON-запросом и ответом Spring RestController POST с телом JSON-запроса Spring RestController POST с JSON-запросом и XML-ответом

Spring RestController DELETE

Резюме

Spring RestController помогает нам сосредоточиться на бизнес-логике, позаботившись о всех шаблонных вещах для создания REST веб-сервисов API.

Вы можете скачать полный проект из нашего Репозитория GitHub.

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