Return Values

    下表描述了支持的控制器方法返回值。所有的返回值都支持反应式(Reactive )类型:

    Controller method return value Description
    @ResponseBody 返回值通过 HttpMessageConverter 实现进行转换并写入响应。参见 @ResponseBody
    HttpEntity, ResponseEntity 指定完整的响应(包括 HTTP 头和正文)的返回值要通过 HttpMessageConverter 实现转换并写入响应。参见 ResponseEntity
    HttpHeaders 用于返回一个有头而无正文的响应。
    String 要用 ViewResolver 实现解析的视图名称,并与隐式模型一起使用:通过命令对象和@ModelAttribute 方法确定。处理程序方法也可以通过声明一个模型参数以编程方式丰富模型(见 显式注册)。
    View 一个与隐式模型一起用于渲染的视图实例:通过命令对象和 @ModelAttribute 方法确定。处理程序方法也可以通过声明一个模型参数来以编程方式丰富模型( 显式注册)。
    java.util.Map, org.springframework.ui.Model 要添加到隐式模型的属性,视图名称通过 RequestToViewNameTranslator 隐式确定。
    @ModelAttribute 一个要添加到模型的属性,视图名称通过 RequestToViewNameTranslator 隐式确定。
    注意,@ModelAttribute 是可选的。参见本表末尾的 「任何其他返回值」。
    ModelAndView object 要使用的视图和模型属性,以及可选的响应状态。
    void 如果一个方法有一个 ServletResponse,一个 OutputStream 参数,或者一个@ResponseStatus 注解,那么这个方法的返回类型为无效(或者返回值为空),被认为是完全处理了响应。如果控制器进行了积极的 ETag 或 lastModified 时间戳检查,也是如此(详见 控制器)。
    如果以上都不是真的,无效的返回类型也可以表示 REST 控制器的 「无响应体」或 HTML 控制器的默认视图名称选择。
    DeferredResult 从任何线程异步产生前述的任何返回值:例如,作为一些事件或回调的结果。参见 异步请求 和延迟结果(DeferredResult)。
    Callable 在 Spring MVC 管理的线程中异步产生上述任何返回值。参见 异步请求Callable
    ListenableFuture, java.util.concurrent.CompletionStage, java.util.concurrent.CompletableFuture 替代 DeferredResult,作为一种便利(例如,当一个底层服务返回其中之一)。
    ResponseBodyEmitter, SseEmitter 用 HttpMessageConverter 实现异步发射一个对象流并写入响应中。也支持作为ResponseEntity 的主体。参见 异步请求HTTP 流
    StreamingResponseBody 异步写到响应的 OutputStream 中。也支持作为 ResponseEntity 的主体。参见 异步请求HTTP 流
    Reactive types — Reactor, RxJava, or others through ReactiveAdapterRegistry DeferredResult 的替代方案是将多值流(例如,Flux,Observable)收集到一个 List。
    对于流式场景(例如,text/event-stream,application/json+stream),SseEmitter 和 ResponseBodyEmitter 被替代,其中 ServletOutputStream 阻塞 I/O 是在 Spring MVC 管理的线程上执行的,并对每次写入的完成进行反压。
    参见 异步请求反应式类型
    Any other return value 任何不符合本表中任何早期值的返回值,如果是 String 或 void,将被视为视图名称(通过RequestToViewNameTranslator 的默认视图名称选择适用),只要它不是简单类型,由 [BeanUtils#isSimpleProperty](https://docs.spring.io/spring-framework/docs/5.3.15/javadoc-api/org/springframework/beans/BeanUtils.html#isSimpleProperty-java.lang.Class-)决定。属于简单类型的值仍未被解决。