Spring RestКонтроллер
Аннотация Spring RestController — это удобная аннотация, которая сама по себе снабжена аннотациями @Controller и @ResponseBody
. Эта аннотация применяется к классу, чтобы пометить его как обработчик запросов. Аннотация Spring RestController используется для создания веб-сервисов RESTful с использованием Spring MVC. Spring RestController заботится о сопоставлении данных запроса с определенным методом обработчика запросов. Как только тело ответа генерируется из метода обработчика, оно преобразует его в ответ 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>
Нам нужны библиотеки Spring MVC, Jackson и JAXB для поддержки запросов и ответов XML и JSON от нашего веб-сервиса REST. Наш файл 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>
Самая важная часть — это bean-компоненты jsonMessageConverter
и xmlMessageConverter
, определенные и заданные в свойстве RequestMappingHandlerAdapter
messageConverters
. Это все, что нужно, чтобы сказать 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")
//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 для этих методов. Точно так же мы возвращаем объект 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. Принять: определяет тип контента, который клиент ожидает в качестве ответа. Если его значение равно \application/xml, будет отправлен ответ в формате XML. Если его значение равно \application/json, то будет отправлен ответ в формате JSON.
Тест Spring RestController
Наше приложение готово к тестированию, я развернул его на Tomcat-9 и тестирую с помощью Postman. Ниже приведены результаты тестирования с пояснениями.
Ответ Spring RestController GET JSON
Spring RestController GET XML-ответ
Список GET Spring RestController
Spring RestController POST
Spring RestController УДАЛИТЬ
Резюме
Spring RestController помогает нам сосредоточиться на бизнес-логике, позаботившись обо всех шаблонах для создания API веб-сервисов REST.
Вы можете загрузить полный проект из нашего репозитория GitHub.