【问题标题】:Returning view from Spring MVC @RestController从 Spring MVC @RestController 返回视图
【发布时间】:2016-01-08 20:00:04
【问题描述】:

由于@RestController@Controller@ResponseBody 的组合,我相信如果我希望我的控制器同时工作 MVC 和 REST 控制器只用 @RestController 注释应该没问题。对吗?

由于@RestController@Controller@ResponseBody, 的组合,我认为它在内部意味着它有利于

  1. 收到http请求(因为@Controller
  2. 以 JSON 格式发送响应(因为@ResponseBody),但可以根据需要进行更改

【问题讨论】:

    标签: java spring-mvc


    【解决方案1】:

    @RestController 不是用来返回要解析的视图。它应该返回将写入响应正文的数据,因此包含@ResponseBody。当@ResponseBody 已经是类级别的注释时,您不能选择性地禁用单个处理程序方法上的@ResponseBody

    您可以通过返回 ModelAndView 来解决它,即使在 @RestController 中也可以使用,但您真的不应该

    @RequestMapping
    public ModelAndView renderFooList() {
        ModelAndView mav = new ModelAndView("foo/list");
        mav.addObject("foos", fooService.getFoos());
        return mav;
    }
    

    最好为返回视图的普通处理程序创建单独的控制器,为 RESTful 内容创建 REST 控制器。或者用普通的 @Controller 注释类并将 @ResponseBody 放在您实际需要的方法上。

    【讨论】:

    • 你能解释一下为什么RestController/ResponseBody会忽略ModelAndView吗?还有哪些类不会被 RestController/ResponseBody 转换为 json 的列表?
    【解决方案2】:

    @RestController 注解,将此类标记为控制器,其中每个方法都返回域对象/pojo 而不是视图。这意味着我们不再使用视图解析器,我们不再直接发送 html 作为响应,而是发送转换为消费者可以理解的格式的域对象。

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 2019-05-14
      • 2010-11-15
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多