【问题标题】:One entity class with two controllers (@RestController and @Controller)一个具有两个控制器(@RestController 和 @Controller)的实体类
【发布时间】:2020-07-08 04:07:18
【问题描述】:

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

【问题讨论】:

    标签: spring-boot spring-mvc spring-restcontroller


    【解决方案1】:

    我将遵循的方法是在类级别使用@Controller,然后在方法级别使用@RequestBody + Content-type 作为“application/json”,以便从 Postman 进行 API 测试。

    对于模型视图,将不使用@RequestBody 并将Content-type 指定为“text/html”并从该方法返回页面。

    示例代码 sn-ps:

    API 测试:

    @RequestMapping(value="/orders", method=RequestMethod.GET, produces="application/json")
    @ResponseBody
    public List<Order> getOrders {
        return orderManager.getAllOrders();
    }
    

    对于模型:

    @RequestMapping(value="/accounts", method=RequestMethod.GET,produces="text/html")
    public String accountSummary() {
        // Put data into model and return view name
        return "summary";
    }
    

    【讨论】:

      【解决方案2】:
      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 测试,使用邮递员处理杂物 另一方面,@Controller 用于处理模型中的 crud 查看

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

      回答您的问题:

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

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

      【讨论】:

        【解决方案3】:

        @RestController@Controller + @ResponseBody。您不需要两个控制器。只需使用一个@RestController,它就适用于您的两种情况。

        【讨论】:

        • RestController 不返回视图。那就是我在问如何处理来自两者或其中之一的视图和数据测试。在这一点上我不清楚。我做了一些研究,但大多数人说 REST 不能返回视图。我需要处理视图和实体类的返回数据。
        • 您是否使用百里香作为您的观点?
        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        相关资源
        最近更新 更多