@RestController 与 ResponseEntity

@RestController with ResponseEntity

我知道 @RestController 实际上是 @Controller 加上 @ResponseBody。但是,如果我将我的方法更改为 return ResponseEntity,如下所示,使用 @RestController 在这里没有特殊任务要执行。

@GetMapping(value="/my-url")
    public ResponseEntity<?> getSomething( @RequestParam(value = "id") String id){
     //code here
}

如果 return 类型是 ResponseEntity ,那是否意味着 @RestController@Controller 执行相同的任务。

如果是这样的话,为什么我看到很多例子仍然使用 @RestControllerResponseEntity 而不是简单地使用 @Controller。我在这里遗漏了什么吗?

如果它只有 return ResponseEntity 的处理程序方法,那么用 @RestController(而不是 @Controller)注释你的控制器 class 是没有意义的。 =36=]

Spring MVC 的默认基础结构为每种不同的受支持 return 类型注册了一个 HandlerMethodReturnValueHandler 实现列表。例如,处理程序方法 returning ModelAndView 个对象有 ModelAndViewMethodReturnValueHandler;方法 returning DeferredResultListenableFutureDeferredResultMethodReturnValueHandlerViewNameMethodReturnValueHandler 方法 returning String 值意味着被解释为视图名称。

列表按顺序处理,并使用找到的第一个支持 return 值的处理程序。实现处理 ResponseEntityHttpEntityMethodProcessor, is registered before the one handling @ResponseBody, RequestResponseBodyMethodProcessor。在某种意义上,@RestController 被相应的处理程序方法 returning ResponseEntity.

忽略了

如果您的控制器 class 有其他处理程序方法 return 需要直接序列化的值,那么保留 @RestController(而不是注释所有那些带有 @ResponseBody 的方法)。但是如果你所有的方法 return ResponseEntity,那么它是不必要的并且可能会产生误导。

仅供参考,处理程序的默认列表是在 RequestMappingHandlerAdapter. You can provide your own list by calling setReturnValueHandlers 中名为 getDefaultReturnValueHandlers() 的私有方法中生成的。