返回值

下表描述了支持的控制器方法返回值。所有返回值都支持 Reactive 类型。

控制器方法返回值 描述

@ResponseBody

返回值通过 HttpMessageConverter 实现进行转换并写入响应。参见 @ResponseBody

HttpEntity<B>, ResponseEntity<B>

指定完整响应(包括 HTTP 标头和正文)的返回值将通过 HttpMessageConverter 实现进行转换并写入响应。参见 ResponseEntity

HttpHeaders

用于返回带有标头且没有正文的响应。

ErrorResponse

要呈现具有正文中详细信息的 RFC 9457 错误响应,请参见 错误响应

ProblemDetail

要呈现具有正文中详细信息的 RFC 9457 错误响应,请参见 错误响应

String

要使用 ViewResolver 实现解析的视图名称,并与隐式模型一起使用——通过命令对象和 @ModelAttribute 方法确定。处理程序方法还可以通过声明 Model 参数以编程方式丰富模型(参见 显式注册)。

View

要用于与隐式模型一起呈现的 View 实例——通过命令对象和 @ModelAttribute 方法确定。处理程序方法还可以通过声明 Model 参数以编程方式丰富模型(参见 显式注册)。

java.util.Map, org.springframework.ui.Model

要添加到隐式模型中的属性,视图名称通过 RequestToViewNameTranslator 隐式确定。

@ModelAttribute

要添加到模型中的属性,视图名称通过 RequestToViewNameTranslator 隐式确定。

请注意,@ModelAttribute 是可选的。请参阅本表末尾的“任何其他返回值”。

ModelAndView 对象

要使用的视图和模型属性,以及可选的响应状态。

FragmentsRendering, Collection<ModelAndView>

用于渲染一个或多个片段,每个片段都有自己的视图和模型。有关详细信息,请参阅 HTML 片段

void

如果方法具有 void 返回类型(或 null 返回值),并且还具有 ServletResponseOutputStream 参数或 @ResponseStatus 注解,则认为该方法已完全处理响应。如果控制器已进行正向 ETaglastModified 时间戳检查,则也为真(有关详细信息,请参见 控制器)。

如果上述情况均不成立,则 void 返回类型还可以表示 REST 控制器的“无响应正文”或 HTML 控制器的默认视图名称选择。

DeferredResult<V>

从任何线程异步生成任何上述返回值——例如,作为某些事件或回调的结果。参见 异步请求DeferredResult

Callable<V>

在 Spring MVC 管理的线程中异步生成任何上述返回值。参见 异步请求Callable

ListenableFuture<V>, java.util.concurrent.CompletionStage<V>, java.util.concurrent.CompletableFuture<V>

作为 DeferredResult 的替代方案,作为一种便利(例如,当底层服务返回其中之一时)。

ResponseBodyEmitter, SseEmitter

异步发出要使用 HttpMessageConverter 实现写入响应的对象流。也支持作为 ResponseEntity 的正文。参见 异步请求HTTP 流

StreamingResponseBody

异步写入响应 OutputStream。也支持作为 ResponseEntity 的正文。参见 异步请求HTTP 流

通过 ReactiveAdapterRegistry 注册的 Reactor 和其他 Reactive 类型

单个值类型,例如 Mono,类似于返回 DeferredResult。多值类型,例如 Flux,可以根据请求的媒体类型被视为流,例如“text/event-stream”、“application/json+stream”,或者以其他方式收集到列表中并呈现为单个值。参见 异步请求Reactive 类型

其他返回值

如果以任何其他方式无法解析返回值,则将其视为模型属性,除非它是由 BeanUtils#isSimpleProperty 确定的简单类型,在这种情况下,它将保持未解析。