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 |
替代 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-) 决定。属于简单类型的值仍未被解决。 |