下表描述了支持的控制器方法参数。任何参数都不支持反应式类型。

    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