Spring RestController
Spring RestController 注释是一种便利注释,它本身用@Controller和注释@ResponseBody
。此注释应用于类以将其标记为请求处理程序。Spring RestController 注释用于使用 Spring MVC 创建 RESTful Web 服务。Spring RestController 负责将请求数据映射到定义的请求处理程序方法。一旦从处理程序方法生成响应主体,它就会将其转换为 JSON 或 XML 响应。
Spring RestController 示例
让我们看看如何轻松地使用 RestController 在 Spring 中创建 REST Web 服务。我们将重用Spring Repository实现并创建一个 restful Web 服务。我们将创建一个独立的 Web 应用程序,而不是在这里使用 Spring Boot。我们还将公开我们的 API 以在请求和响应中支持 JSON 和 XML。下图显示了我们最终的项目结构。Spring 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>
<!-- 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 库来支持来自 REST Web 服务的 XML 和 JSON 请求和响应。我们的 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.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
和bean 。这就是告诉 spring 我们希望我们的应用程序支持 JSON 和 XML,并且这些是用于转换的 bean。xmlMessageConverter
RequestMappingHandlerAdapter
messageConverters
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:定义请求正文中的内容类型,如果其值为“application/xml”,则 Spring 会将请求正文视为 XML 文档。如果其值为“application/json”,则请求正文将被视为 JSON。Accept :定义客户端期望作为响应的内容类型。如果其值为“application/xml”,则会发送 XML 响应。如果其值为“application/json”,则会发送 JSON 响应。Content-Type
Spring RestController 测试
我们的应用程序已准备好进行测试,我已将其部署在 Tomcat-9 上并使用 Postman 进行测试。以下是测试结果及其说明。
Spring RestController 获取 JSON 响应
这是一个简单的 GET 请求,需要注意的重点是“Accept”标头的值。
Spring RestController 获取 XML 响应
当我们将“Accept”标头值更改为“application/xml”时,我们得到了 XML 响应。
Spring RestController 获取列表
让我们尝试调用 API 来获取员工列表。我们获取了 JSON 中具有匿名根元素的元素列表。由于 XML 不支持匿名根元素,因此我们收到了异常消息。
春季 RestController POST
Spring RestController POST 带有 JSON 请求和响应 Spring RestController POST 带有 JSON 请求主体 Spring RestController POST 带有 JSON 请求和 XML 响应
Spring RestController 删除
概括
Spring RestController 通过处理创建 REST Web 服务 API 所需的所有样板内容,帮助我们专注于业务逻辑。
您可以从我们的GitHub 存储库下载完整的项目。