下表描述了支持的控制器方法参数。任何参数都不支持反应式类型。
JDK 8 的 java.util.Optional
被支持作为方法参数,与具有必填属性的注解(例如,@RequestParam、@RequestHeader 和其他)相结合,相当于 required=false
。
Controller method argument | Description |
---|---|
WebRequest, NativeWebRequest | 对请求参数以及请求和会话属性的通用访问,无需直接使用 Servlet API。 |
javax.servlet.ServletRequest, javax.servlet.ServletResponse | 选择任何特定的请求或响应类型,例如 ServletRequest、HttpServletRequest,或者 Spring的 MultipartRequest、MultipartHttpServletRequest。 |
javax.servlet.http.HttpSession | 执行一个会话的存在。因此,这样的参数永远不会是空的。请注意,会话访问不是线程安全的。如果允许多个请求同时访问一个会话,请考虑将 RequestMappingHandlerAdapter 实例的 synchronizeOnSession 标志设置为 true。 |
javax.servlet.http.PushBuilder | Servlet 4.0 推送构建器 API,用于编程式 HTTP/2 资源推送。请注意,根据 Servlet 规范,如果客户端不支持该 HTTP/2 功能,则注入的 PushBuilder 实例可以为空。 |
java.security.Principal | 当前认证的用户—如果知道的话,可能是一个特定的 Principal 实现类。 请注意,这个参数不会被急切地解析,如果它被注解了,以便允许自定义解析器在通过 HttpServletRequest#getUserPrincipal 的默认解析之前解析它。例如,Spring 安全认证实现了 Principal,并将通过 HttpServletRequest#getUserPrincipal 被注入,除非它也被 @AuthenticationPrincipal 注释,在这种情况下,它被自定义的 Spring 安全解析器通过 Authentication#getPrincipal 解析。 |
HttpMethod | 请求的 HTTP Method。 |
java.util.Locale | 当前的请求语言,由最具体的 LocaleResolver 决定(实际上是配置的 LocaleResolver 或 LocaleContextResolver)。 |
java.util.TimeZone + java.time.ZoneId | 与当前请求相关的时区,由 LocaleContextResolver 决定。 |
java.io.InputStream, java.io.Reader | 用于访问 Servlet API 所暴露的原始请求体(request body)。 |
java.io.OutputStream, java.io.Writer | 用于访问 Servlet API 所暴露的原始响应体。 |
@PathVariable | 用于访问 URI 模板变量。见 URI 模式。 |
@MatrixVariable | 用于访问 URI 路径段中的 name-value。参见 Matrix 变量。 |
@RequestParam | 用于访问 Servlet 请求参数,包括多部件文件。参数值被转换为声明的方法参数类型。参见@RequestParam 以及 Multipart。 注意,对于简单的参数值,使用 @RequestParam 是可选的。参见本表末尾的 「任何其他参数」。 |
@RequestHeader | 用于访问请求头。头部值被转换为声明的方法参数类型。参见 @RequestHeader。 |
@CookieValue | 用于访问 cookies。Cookie 值被转换为声明的方法参数类型。参见 @CookieValue。 |
@RequestBody | 用于访问 HTTP 请求正文。通过使用 HttpMessageConverter 实现,主体内容被转换为声明的方法参数类型。参见 @RequestBody。 |
HttpEntity | 用于访问请求头文件和正文。主体用一个 HttpMessageConverter 来转换。参见HttpEntity。 |
@RequestPart | 对于访问一个 multipart/form-data 请求中的 part,用一个 HttpMessageConverter 来转换该 part 的主体。参见 Multipart。 |
java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap | 用于访问 HTML 控制器中使用的模型,并作为视图渲染的一部分暴露给模板。 |
RedirectAttributes | 指定在重定向情况下使用的属性(即附加到查询字符串中)和临时存储到重定向后的请求中的 Flash 属性。参见 重定向属性 和 Flash 属性。 |
@ModelAttribute | 用于访问模型中的一个现有属性(如果不存在则实例化),并应用数据绑定和验证。参见 @ModelAttribute 以及 Model 和 DataBinder。 注意,@ModelAttribute 的使用是可选的(例如,设置其属性)。参见本表末尾的 「任何其他参数」。 |
Errors, BindingResult | 用于访问来自命令对象(即 @ModelAttribute 参数)的验证和数据绑定的错误,或来自 @RequestBody 或 @RequestPart 参数的验证的错误。你必须在验证过的方法参数之后立即声明一个 Errors,或 BindingResult 参数。 |
SessionStatus + class-level @SessionAttributes | 用于标记表单处理完成,这将触发对通过类级 @SessionAttributes 注解声明的会话属性的清理。更多细节见 @SessionAttributes。 |
UriComponentsBuilder | 用于准备一个相对于当前请求的主机、端口、scheme、上下文路径和 Servlet 映射的字面部分的 URL。参见 URI 链接。 |
@SessionAttribute | 用于访问任何会话属性,与因类级 @SessionAttributes 声明而存储在会话中的模型属性不同。更多细节见 @SessionAttributes。 |
@RequestAttribute | 用于访问请求属性。更多细节见 @RequestAttribute。 |
Any other argument | 如果一个方法参数没有与本表中的任何早期值相匹配,并且它是一个简单的类型(由[BeanUtils#isSimpleProperty](https://docs.spring.io/spring-framework/docs/5.3.15/javadoc-api/org/springframework/beans/BeanUtils.html#isSimpleProperty-java.lang.Class-) 决定,它被解析为 @RequestParam 。否则,它将被解析为@ModelAttribute 。 |