Spring 框架:@RestController 与 @Controller

x33g5p2x  于2022-09-25 转载在 Spring  
字(4.5k)|赞(0)|评价(0)|浏览(265)

Spring MVC 框架和 REST

Spring 的基于注释的 MVC 框架简化了创建 RESTful Web 服务的过程。传统 Spring MVC 控制器和 RESTful Web 服务控制器之间的主要区别在于 HTTP 响应主体的创建方式。传统的 MVC 控制器依赖于 View 技术,而 RESTful Web 服务控制器只是简单地返回对象,对象数据以 JSON/XML 的形式直接写入 HTTP 响应。有关使用 Spring 框架创建 RESTful Web 服务的详细说明,请单击 here

Spring MVC REST 工作流

以下步骤描述了一个典型的 Spring MVC REST 工作流:

  1. 客户端以 URI 形式向 Web 服务发送请求。
  • 请求被 DispatcherServlet 拦截,该 DispatcherServlet 查找 Handler Mappings 及其类型。

  • 应用程序上下文文件中定义的 Handler Mappings 部分告诉 DispatcherServlet 根据传入请求使用哪种策略来查找控制器。

  • Spring MVC 支持三种不同类型的映射请求 URI 到控制器:注释、名称约定和显式映射。

  • 请求由控制器处理,响应返回给 DispatcherServlet,然后调度到视图。

在图 1 中,请注意在传统工作流中,ModelAndView 对象从控制器转发到客户端。 Spring 允许您直接从控制器返回数据,而无需查找视图,使用方法上的 @ResponseBody 注释。从版本 4.0 开始,通过引入 @RestController 注释进一步简化了此过程。下面解释每种方法。

使用@ResponseBody 注解

当您在方法上使用 @ResponseBody 注解时,Spring 会自动转换返回值并将其写入 HTTP 响应。 Controller 类中的每个方法都必须使用@ResponseBody 进行注解。

Behind the Scenes

Spring 有一个在后台注册的 HttpMessageConverters 列表。 HTTPMessageConverter 的职责是将请求正文转换为特定的类,然后再次转换回响应正文,具体取决于预定义的 mime 类型。每次发出的请求到达@ResponseBody 时,Spring 都会遍历所有已注册的 HTTPMessageConverters,寻找第一个符合给定 mime 类型和类的请求,然后将其用于实际转换。

代码示例

让我们用一个简单的例子来看看@ResponseBody。

项目创建和设置
  1. 在 Eclipse 或 MyEclipse IDE. 中创建一个支持 Maven 的动态 Web 项目
    1.为项目配置Spring支持。如果您使用的是 Eclipse IDE,则需要下载所有 Spring 依赖项并配置您的 pom.xml 以包含这些依赖项。在 MyEclipse 中,您只需要 install the Spring facet,其余的配置会自动发生。
  2. 创建以下名为 Employee 的 Java 类。这个类是我们的 POJO。
package com.example.spring.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Employee")
public class Employee {
    String name; 
    String email;
    public String getName() {
       return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public String getEmail() {
       return email;
    }
    public void setEmail(String email) {
      this.email = email;
    }
    public Employee() {
    } 
}

然后,创建以下 @Controller 类:

package com.example.spring.rest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.example.spring.model.Employee;
@Controller
@RequestMapping("employees")
public class EmployeeController {
    Employee employee = new Employee();
    @RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody Employee getEmployeeInJSON(@PathVariable String name) {
       employee.setName(name);
       employee.setEmail("employee1@genuitec.com");
    return employee; 
    }
    @RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
    public @ResponseBody Employee getEmployeeInXML(@PathVariable String name) {
       employee.setName(name);
     employee.setEmail("employee1@genuitec.com");
       return employee; 
    }
}
  • <context:component-scan><mvc:annotation-driven /> 标签添加到 Spring 配置文件中。

  • <context:component-scan> 激活注释并扫描包以在应用程序上下文中查找和注册 bean。

  • 如果 Jackson/JAXB 库位于类路径中,则 <mvc:annotation-driven/> 添加对读取和写入 JSON/XML 的支持。

  • 对于 JSON 格式,将 jackson-databind jar 包括在内,对于 XML,将 jaxb-api-osgi jar 包括到项目类路径中。

  • 在任何服务器(例如 Tomcat)上部署和运行应用程序。如果您使用的是 MyEclipse,则可以在 embedded Tomcat server 上运行该项目。

JSON - 使用 URL:http://localhost:8080/SpringRestControllerExample/rest/employees/Bob 并显示以下输出:

XML — 使用
URL:http://localhost:8080/SpringRestControllerExample/rest/employees/Bob.xml 并显示以下输出:

使用@RestController 注解

Spring 4.0 引入了@RestController,这是控制器的一个特殊版本,它是一个方便的注解,只不过添加了@Controller 和@ResponseBody 注解。通过使用@RestController 注解对控制器类进行注解,您不再需要将@ResponseBody 添加到所有请求映射方法中。 @ResponseBody 注解默认是激活的。点击 here 了解详情。

要在我们的示例中使用@RestController,我们需要做的就是将@Controller 修改为@RestController 并从每个方法中删除@ResponseBody。结果类应如下所示:

package com.example.spring.rest;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.example.spring.model.Employee;
@RestController
@RequestMapping("employees")
public class EmployeeController {
    Employee employee = new Employee();
    @RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
    public Employee getEmployeeInJSON(@PathVariable String name) {
       employee.setName(name);
       employee.setEmail("employee1@genuitec.com");
       return employee;
    }
    @RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
    public Employee getEmployeeInXML(@PathVariable String name) {
       employee.setName(name);
       employee.setEmail("employee1@genuitec.com");
    return employee; 
    } 
}

请注意,我们不再需要将 @ResponseBody 添加到请求映射方法中。进行更改后,再次在服务器上运行应用程序会产生与以前相同的输出。

结论

如您所见,使用 @RestController 非常简单,并且是从 Spring v4.0 开始创建 MVC RESTful Web 服务的首选方法。本文来自DZone

相关文章