Spring MVC 5 文档翻译与解析 —— 普通与异常Handler参数和返回值

普通Handler方法形参

下表展现支持的控制器方法形参。 Reactive类型不被任何形参支持

支持Java8的java.util.Optional结合具有required属性的注解作为方法形参 如@RequestParam, @RequestHeader等等,等效于required=false

√WebRequest,NativeWebRequest 访问请求参数,请求与session的attributes,而不直接使用Servlet API

√javax.servlet.ServletRequest, javax.servlet.ServletResponse 选择任何指定request或response类型,比如ServletRequest, HttpServletRequest,或Spring的 MultipartRequest, MultipartHttpServletRequest

√javax.servlet.http.HttpSession 强制出现一个Session,此参数永不为空 注意: Session 访问时线程不安全的. 如果允许多个请求同时访问session考虑设置RequestMappingHandlerAdapter的synchronizeOnSession标记为true

√javax.servlet.http.PushBuilder

√Servlet4.0 push builder API用于编程式的HTTP/2 资源push。 注意,每一个Servlet 的细节,如果客户端不支持HTTP/2 功能,注入的PushBuilder实例可能是null 未完成

√java.security.Principal

目前经过身份验证的用户,可能是特定的Principal实现类(如果已知)。

√HttpMethod 请求的HTTP方法

√java.util.Locale 当前请求的 locale, 由最细化的有效LocaleResolver决定, 实际上有配置的LocaleResolver/LocaleContextResolver决定.

√java.util.TimeZone + java.time.ZoneId 当前请求相关的time zone,由LocaleContextResolver决定.

√java.io.inputStream, java.io.Reader 访问raw response body如Servlet API所暴露的一样.

√java.io.OutputStream, java.io.Writer 访问raw response body如Servlet API所暴露的一样.

√@PathVariable 访问URI模板变量,见URI patterns.

√@MatrixVariable 访问URI路径段中的name-value对,见Matrix Variables.

√@RequestParam 访问Servlet请求参数,参数值被转换为声明的方法参数类型,见Using @RequestParam. 注意使用@RequestParam是可选的(比如去设置attributes),见表尾的 “任何其他参数”

√@RequestHeader 访问Servlet请求Header,Header值被转换为声明的方法参数类型,见Using @RequestHeader.

√@CookieValue 访问cookies,cookies值被转换为声明的方法参数类型,见Using @CookieValue.

√@RequestBody 访问Request Body,Request Body值通过使用HttpMessageConverter 转换为声明的方法参数类型,见Using @RequestBody.

√HttpEntity<B> 访问请求Header和Body,Body通过HttpMessageConverter 实现转换,见HttpEntity.

√@RequestPart 访问multipart/form-data的一个part,见Multipart.

√java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap 访问一个用于HTML控制器并暴露于模板的model作 response呈现用, 如Servlet API所暴露的一样.

√RedirectAttributes 指定在redirect情况下使用的attributes,比如,添加到查询String,或flash属性,他们被临时储存直到 请求redirect后仍然可访问 见Redirect attributes和Flash attributes.

√@ModelAttribute 访问一个model中存在的attribute(如果不存在将会被实例化),并应用数据绑定 和验证。 见Using @ModelAttribute 和Model 和Using DataBinder.

注意@ModelAttribute是可选的(比如设置attributes) 见表格末尾的,任何其他类型

√Errors,BindingResult 要访问command对象(一个@ModelAttribute参数)或 @RequestBody , @RequestPart参数的验证和数据绑定 你必须在被验证的方法参数后直接声明一个Errors或BindingResult参数

√SessionStatus + 类级别的 @SessionAttributes 标记表单处理完成,这将触发通过类级别@SessionAttributes注解声明的session attributes的cleanup 详见Using @SessionAttributes

√UriComponentsBuilder 准备一个相对于当前域名,端口,scheme,context路径 servlet映射的字面量部分的URL,见URI Links.

√@SessionAttribute 访问任何session attribute; 而类级别@SessionAttributes声明的作用是model attributes被存储在session中 详情见 @SessionAttribute

√@RequestAttribute 访问 request attributes. 详见@RequestAttribute

√任何其他参数 如果一个方法的参数不是简单类型()也不匹配此表上的其他类型 根据 BeanUtils#isSimpleProperty 判断,如果是简单类型,解析为@RequestParam,否则解析 为@ModelAttribute.

普通Handler返回值类型

√@ResponseBody

返回值将通过HttpMessageConverters转换并写到response 见@ResponseBody.

√HttpEntity<B>, ResponseEntity<B>

返回值指定整个response,包括Http头和body,它被HttpMessageConverters转换并写到response 见ResponseEntity

√HttpHeaders 返回一个带header而没有body的response

√String 一个将被ViewResolver解析的视图名,与内含model(由command对象和@ModelAttribute方法决定)一起被使用 handler方法也可通过声明一个model参数编程式地丰富model参数 见Explicit Registrations

√View 一个视图实例,用于配合内含model一起渲染 此model通过command objects和@ModelAttribute方法决定 handler方法也可通过声明一个model参数编程式地丰富model 见Explicit Registrations

√java.util.Map, org.springframework.ui.Model 一些将被添加到内含model的Atrributes,并附带由一个RequestToViewNameTranslator隐式决定的视图名

√@ModelAttribute 一些将被添加到内含model的Atrributes,并附带由一个RequestToViewNameTranslator隐式决定的视图名 注意 @ModelAttribute 是可选的. 见下面的"Any other return value" .

√ModelAndView 对象 使用的view和model attributes,可带一个response状态

√void 一个具有void返回类型(或返回值为null)的方法,如果它还具有ServletResponse,或OutputStream参数或@ResponseStatus注释,则认为已完全处理该响应。 如果控制器作一个正值ETag或lastModified 时间戳检查,亦是如此(详情见Controllers). 如果上面的情况都不是,一个void的返回类型对于Rest控制器表明没有response body,对于HTML控制器表明使用默认视图名

√DeferredResult<V> 从任何线程异步生成任何前面的返回值,比如一些事件或回调的结果 见Asynchronous Requests 和 Using DeferredResult.

√Callable<V> 在Spring MVC管理的线程中异步处理上面任何返回值 见 Asynchronous Requests 和 Using Callable.

√ListenableFuture<V>, java.util.concurrent.CompletionStage<V>, java.util.concurrent.CompletableFuture<V> 作为DeferredResult方便的替代(例如,当底层服务返回其中一个时)。

√ResponseBodyEmitter, SseEmitter 通过HttpMessageConverter实现异步发出一个object的stream到response 也支持ResponseEntity中的body 见Asynchronous Requests 和 HTTP Streaming.

√StreamingResponseBody 异步写数据到response OutputStream 也支持ResponseEntity中的body 见Asynchronous Requests 和 HTTP Streaming.

√Reactive类型 Reactor, RxJava或其他通过ReactiveAdapterRegistry适配的类型

以multi-value streams(如Flux, Observable)代替DeferredResult,收集到list

在流化的场景下比如text/event-stream, application/json+stream,使用SseEmitter and ResponseBodyEmitter替换 在ServletOutputStream 阻塞IO在Spring MVC管理的线程执行, 并且每次写完成时使用back pressure 见 Asynchronous Requests 和 Reactive Types.

√任何其他类型的返回值

任何与此表中的任何前面的值都不匹配且返回值为String或void的返回值将被视为视图名称(通过RequestToViewNameTranslator选择默认视图名称)

如果一个返回值没有匹配到上面的任何类型,默认它将作为model attribute 被添加到model,除非它是一个简单类型(由BeanUtils#isSimpleProperty决定),这种情况下将保留unresolved

异常Handler方法参数

@ExceptionHandler 支持以下参数

异常类型

访问引发的异常

√HandlerMethod

访问引发异常的控制器

√WebRequest, NativeWebRequest

不使用Servlet API就能访问请求参数,请求及session的attribute,

√javax.servlet.ServletRequest, javax.servlet.ServletResponse 选取任何指定的request或response类型 —  比如 ServletRequest, HttpServletRequest,或 Spring的 MultipartRequest, MultipartHttpServletRequest.

√javax.servlet.http.HttpSession 强制出现一个Session,此参数永不为空 注意: Session 访问时线程不安全的. 如果允许多个请求同时访问session考虑设置RequestMappingHandlerAdapter的synchronizeOnSession标记为true

√java.security.Principal 目前经过身份验证的用户,可能是特定的Principal实现类(如果已知)。

√HttpMethod 请求的HTTP方法

√java.util.Locale 当前请求的 locale, 由最细化的有效LocaleResolver决定, 实际上有配置的LocaleResolver/LocaleContextResolver决定.

√java.util.TimeZone + java.time.ZoneId 当前请求相关的time zone,由LocaleContextResolver决定.

√java.io.OutputStream, java.io.Writer 访问raw response body如Servlet API所暴露的一样.

√java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap 访问一个model作error response用, 如Servlet API所暴露的一样.

√RedirectAttributes 指定在redirect情况下使用的attributes,比如,添加到查询String,或flash属性,他们被临时储存直到 请求redirect后仍然可访问 见Redirect attributes和Flash attributes.

√@SessionAttribute 访问任何session attribute; 而类级别@SessionAttributes声明的作用是model attributes被存储在session中 详情见 @SessionAttribute

√@RequestAttribute 访问 request attributes. 详见@RequestAttribute

异常Handler方法返回值

√@ExceptionHandler 方法支持以下返回值:

√@ResponseBody 返回值将通过HttpMessageConverters转换并写到response 见@ResponseBody.

√HttpEntity<B>, ResponseEntity<B> 返回值指定整个response,包括Http头和body,它被HttpMessageConverters转换并写到response 见ResponseEntity

√String 一个将被ViewResolver解析的视图名,与内含model(由command对象和@ModelAttribute方法决定)一起被使用 handler方法也可通过声明一个model参数编程式地丰富model参数(前面提到的)

√View 一个视图实例,用于配合内含model一起渲染 此model通过command objects和@ModelAttribute方法决定 handler方法也可通过声明一个model参数编程式地丰富model(前面提到过)

√java.util.Map, org.springframework.ui.Model 一些将被添加到内含model的Atrributes,并附带由一个RequestToViewNameTranslator隐式决定的视图名

√@ModelAttribute 一些将被添加到内含model的Atrributes,并附带由一个RequestToViewNameTranslator隐式决定的视图名 注意 @ModelAttribute 是可选的. 见下面的"Any other return value" .

√ModelAndView 对象 使用的view和model attributes,可带一个response状态

√void 一个具有void返回类型(或返回值为null)的方法,如果它还具有ServletResponse,或OutputStream参数或@ResponseStatus注释,则认为已完全处理该响应。 如果控制器作一个正值ETag或lastModified 时间戳检查,亦是如此(详情见Controllers). 如果上面的情况都不是,一个void的返回类型对于Rest控制器表明没有response body,对于HTML控制器表明使用默认视图名

√任何其他类型的返回值
任何与此表中的任何前面的值都不匹配且返回值为String或void的返回值将被视为视图名称(通过RequestToViewNameTranslator选择默认视图名称) 如果一个返回值没有匹配到上面的任何类型,默认它将作为model attribute 被添加到model,除非它是一个简单类型(由BeanUtils#isSimpleProperty决定),这种情况下将保留unresolved

转载于:https://my.oschina.net/voidgeek/blog/2206639

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值