Spring RestController

时间:2020-02-23 14:35:59  来源:igfitidea点击:

Spring RestController注释是一个方便注释,它本身通过@Controller和@ ResponseBody进行注释。
该注释将应用于一个类,以将其标记为请求处理程序。

Spring RestController批注用于使用Spring MVC创建RESTful Web服务。
Spring RestController负责将请求数据映射到已定义的请求处理程序方法。
从处理程序方法生成响应主体后,它将其转换为JSON或者XML响应。

Spring RestController示例

让我们看看我们如何轻松地使用RestController在Spring中创建REST网络服务。
我们将重用Spring Repository实现并创建一个宁静的Web服务。

我们将创建一个独立的Web应用程序,在这里不使用Spring Boot。
我们还将在请求和响应中公开支持JSON和XML的API。

Spring Repository教程中已经提供了Model和Repository类。
我们将在这里更多地关注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>

<!-- Hymanson for REST JSON Support -->
<dependency>
	<groupId>com.fasterxml.Hymanson.core</groupId>
	<artifactId>Hymanson-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,Hymanson和JAXB库来支持XML和JSON请求以及来自REST Web服务的响应。

我们的web.xml文件用于将Spring MVC DispatcherServlet配置为前端控制器。

现在让我们看一下Spring Context文件。

<?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.theitroad.spring" 

	<beans:bean id="jsonMessageConverter"
		class="org.springframework.http.converter.json.MappingHymanson2HttpMessageConverter" 
	<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>

最重要的部分是在RequestMappingHandlerAdaptermessageConverters属性中定义和设置的jsonMessageConverterxmlMessageConverterbean。
告诉Spring我们需要所有这些来支持我们的应用程序同时支持JSON和XML,并且这些都是用于转换的bean。

Spring RestController类

这是我们的Spring RestController类的实现。

package com.theitroad.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.theitroad.spring.model.Employee;
import com.theitroad.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对象作为Response Body返回,Spring会再次将其转换为JSON/XML响应。

接受和内容类型请求标头

我们已经将REST应用程序配置为可以同时使用XML和JSON。
因此,它将如何知道请求是XML还是JSON。
以及是否应以JSON或者XML格式发送响应。
这是使用"接受"和"内容类型"请求标头的地方。

Content-Type:定义了请求主体中内容的类型,如果其值为" application/xml",那么Spring将把请求主体视为XML文档。
如果其值为" application/json",则请求正文被视为JSON。

接受:定义客户端期望作为响应的内容类型。
如果其值为" application/xml",则将发送XML响应。
如果其值为" application/json",则将发送JSON响应。