@ControllerAdvice 之 @InitBinder
-
RequestMappingHandlerAdapter 初始化时会解析 @ControllerAdvice 中的 @InitBinder 方法
-
RequestMappingHandlerAdapter 会以类为单位,在该类首次使用时,解析此类的 @InitBinder 方法
-
以上两种 @InitBinder 的解析结果都会缓存来避免重复解析
-
控制器方法调用时,会综合利用本类的 @InitBinder 方法和 @ControllerAdvice 中的 @InitBinder 方法创建绑定工厂
控制器方法执行流程
HandlerMethod 需要
-
bean 即是哪个 Controller
-
method 即是 Controller 中的哪个方法
ServletInvocableHandlerMethod 需要
-
WebDataBinderFactory 负责对象绑定、类型转换
-
ParameterNameDiscoverer 负责参数名解析
-
HandlerMethodArgumentResolverComposite 负责解析参数
-
HandlerMethodReturnValueHandlerComposite 负责处理返回值
-
RequestMappingHandlerAdapter 初始化时会解析 @ControllerAdvice 中的 @ModelAttribute 方法
-
RequestMappingHandlerAdapter 会以类为单位,在该类首次使用时,解析此类的 @ModelAttribute 方法
-
以上两种 @ModelAttribute 的解析结果都会缓存来避免重复解析
-
控制器方法调用时,会综合利用本类的 @ModelAttribute 方法和 @ControllerAdvice 中的 @ModelAttribute 方法创建模型工厂
返回值处理器
常见的返回值处理器
-
ModelAndView,分别获取其模型和视图名,放入 ModelAndViewContainer
-
返回值类型为 String 时,把它当做视图名,放入 ModelAndViewContainer
-
返回值添加了 @ModelAttribute 注解时,将返回值作为模型,放入 ModelAndViewContainer
-
此时需找到默认视图名
-
-
返回值省略 @ModelAttribute 注解且返回非简单类型时,将返回值作为模型,放入 ModelAndViewContainer
-
此时需找到默认视图名
-
-
返回值类型为 ResponseEntity 时
-
此时走 MessageConverter,并设置 ModelAndViewContainer.requestHandled 为 true
-
-
返回值类型为 HttpHeaders 时
-
会设置 ModelAndViewContainer.requestHandled 为 true
-
-
返回值添加了 @ResponseBody 注解时
-
此时走 MessageConverter,并设置 ModelAndViewContainer.requestHandled 为 true
-