方法参数
下表显示了支持的控制器方法参数。
对于需要阻塞I/O(例如,读取请求体)才能解决的参数,支持使用反应式类型(Reactor、RxJava或其他库(如https://github.com/webflux/reactive-libraries.md))。这一点会在“描述”列中标明。而对于不需要阻塞的参数,则不期望使用反应式类型。
JDK 1.8中的java.util.Optional可以作为方法参数使用,当与具有required属性的注解(例如@RequestParam、@RequestHeader等)结合使用时,其效果等同于required=false。
| 控制器方法参数 | 描述 |
|---|---|
ServerWebExchange | 可以访问完整的ServerWebExchange容器,该容器用于处理HTTP请求和响应、请求和会话属性、checkNotModified方法等。 |
ServerHttpRequest, ServerHttpResponse | 对HTTP请求或响应的访问。 |
WebSession | 对会话的访问。除非添加了属性,否则不会强制启动新的会话。支持反应型类型(reactive types)。 |
java.security.Principal | 当前已认证的用户——如果已知的话,可能是某个具体的Principal实现类。支持反应式类型(reactive types)。 |
org.springframework.http.HttpMethod | 请求的HTTP方法。 |
java.util.Locale | 当前的请求区域设置(locale),是由最具体的 LocaleResolver 决定的——实际上,就是配置好的 LocaleResolver 或 LocaleContextResolver。 |
java.util.TimeZone + java.time.ZoneId | 当前请求所关联的时区,由LocaleContextResolver确定。 |
@PathVariable | 要访问 URI 模板变量,请参阅 URI 模式。 |
@MatrixVariable | 有关访问URI路径段中的名称-值对的信息,请参阅矩阵变量。 |
@RequestParam | 用于访问查询参数。参数值会被转换为声明的方法参数类型。请参见@RequestParam。 请注意,使用 @RequestParam是可选的——例如,可以设置其属性。请参阅本表后面的“其他参数”。 |
@RequestHeader | 用于访问请求头。请求头的值会转换为声明的方法参数类型。请参阅@RequestHeader。 |
@CookieValue | 为了访问cookie,cookie的值会被转换为声明的方法参数类型。请参阅@CookieValue。 |
@RequestBody | 用于访问HTTP请求体。通过使用HttpMessageReader实例,请求体内容会被转换为声明的方法参数类型。支持反应式(reactive)类型。请参阅@RequestBody。 |
HttpEntity<B> | 用于访问请求头和请求体。请求体通过HttpMessageReader实例进行转换。支持响应式类型。详见HttpEntity。 |
@RequestPart | 用于访问multipart/form-data请求中的部分数据。支持反应式类型(reactive types)。请参阅Multipart Content和Multipart Data。 |
java.util.Map or org.springframework.ui.Model | 用于访问在HTML控制器中使用的模型,该模型作为视图渲染的一部分暴露给模板。 |
@ModelAttribute | 要访问模型中已存在的属性(如果不存在则进行实例化),并应用数据绑定和验证功能,请参阅@ModelAttribute,以及Model和DataBinder。 请注意,使用*@ModelAttribute*是可选的——例如,可以用来设置其属性。请参见本表后面的“其他参数”。 |
Errors or BindingResult | 为了访问命令对象(即@ModelAttribute参数)的验证和数据绑定过程中产生的错误,必须在经过验证的方法参数之后立即声明一个Errors或BindingResult参数。 |
SessionStatus + class-level @SessionAttributes | 用于标记表单处理完成,这将触发通过类级@SessionAttributes注解声明的会话属性的清理。详情请参见@SessionAttributes。 |
UriComponentsBuilder | 用于准备一个相对于当前请求的主机、端口、协议和上下文路径的URL。请参阅URI链接。 |
@SessionAttribute | 与通过类级别的@SessionAttributes声明存储在会话中的模型属性不同,要访问任何会话属性(session attribute),请参见@SessionAttribute以获取更多详细信息。 |
@RequestAttribute | 如需访问请求属性,请参阅@RequestAttribute以获取更多详细信息。 |
| 还有其他论点吗? | 如果方法参数与上述任何一种类型都不匹配,那么默认情况下,如果它是简单类型(根据BeanUtils#isSimpleProperty的判断),它将被解析为@RequestParam;否则,它将被解析为@ModelAttribute。 |