Spring RestController
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
属性中定义和设置的jsonMessageConverter
和xmlMessageConverter
bean。
告诉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响应。