首页 > 解决方案 > 一个具有两个控制器(@RestController 和 @Controller)的实体类

问题描述

我正在尝试构建一个同时处理@RestController@Controller. 据我了解,这@RestController是使用邮递员进行 API 测试来处理 crud 进程,另一方面@Controller是在模型视图中处理 crud。是否可以在 Spring Boot 应用程序中为一个实体类创建这两个控制器,并使它们都从处理 crud 实现逻辑的服务类调用相同的方法?请为您的解释提供一个示例,其中包含一个实体类和两个控制器,以便为我阐明这个想法。

标签: spring-bootspring-mvcspring-restcontroller

解决方案


  1. RestController 是 Controller 和 ResponseBody 注解的元注解。注解是从 Spring 4.0 版本中购买的,它可以帮助您设计控制器,其响应不是 ModelandView,而是返回值是 JSON/XML 形式的原始数据(还有其他类型的 MediaType 可以使用 producer 和消耗@RequestMapping的参数)
  2. 当您定义控制器时,调度程序 servlet 与 ViewResolver 对话以将返回的字符串解析为视图/页面。在 @RestController 的情况下,调度程序 servlet 使用 HttpMessageConverters 以请求格式 - json/xml 将原始响应发送回客户端。
  3. 所以 REST API 是一个端点,它可以帮助您通过网络公开您的资源以供另一个 SERVICE 使用;Spring 帮助您使用 @RestController 类编写 REST API。如果您使用 jsp/thymeleaf 作为与应用程序进行人机交互的渲染引擎来开发基于 Web 的应用程序,您将使用 @Controller。

所以,你写的:

@RestContrller 用于 API 测试,使用邮递员处理 crud 进程,另一方面 @Controller 用于处理模型视图中的 crud

不完全正确。您使用 @RestController 构建 REST API。您使用 Postman 测试端点,但 @RestController 不用于使用 postman 进行 API 测试。您可以使用它来构建端点并使用邮递员对其进行测试(您也可以使用其他客户端和框架来测试您的端点)。

回答你的问题:

是否可以在 Spring Boot 应用程序中为一个实体类创建这两个控制器,并使它们都从处理 crud 实现逻辑的服务类调用相同的方法?

是的,可以让@REstController 和@Controller 为同一个实体使用同一个服务类(事实上,如果您的视图和json 中的响应的业务逻辑相同——您将只有一个服务bean)。您的应用程序很可能有一个使用 jsp 为人类用户构建的前端,并且还公开了端点以与其他服务交互;这通常与大型公司相关,在这些公司中,多个服务在功能和数据方面相互依赖。但是您需要确保您的端点没有冲突或相同。通常,如果我们有一个控制器映射为 /books -> 在屏幕上显示书籍列表,我们将有一个类似的休息控制器映射 - /api/v1/books -> 以返回书籍列表。


推荐阅读