环境:Springboot2.4.12简介@Controller或@ControllerAdvice类可以有@InitBinder方法来初始化WebDataBinder的实例,它可以:绑定请求参数(即表单或查询数据)到模型对象。将基于字符串的请求值(如请求参数、路径变量、headers、cookies等)转换为控制器方法参数的目标类型。在呈现HTML表单时将模型对象的值格式化为字符串值。@InitBinder方法可以注册特定于控制器的java.bean.PropertyEditor或SpringConverter和Formatter组件。或者,您可以使用MVC配置在全局共享的FormattingConversionService中注册Converter和Formatter类型。@InitBinder方法支持许多与@RequestMapping方法相同的参数,除了@ModelAttribute(命令对象)参数。通常,它们使用WebDataBinder参数(用于注册)和void返回值声明。应用示例@RestController@RequestMapping("/demos")publicclassDemoController{@InitBinder//1publicvoidbind(WebDataBinderbinder){//2binder.registerCustomEditor(Long.class,newPropertyEditorSupport(){//3@OverridepublicvoidsetAsText(Stringtext)throwsIllegalArgumentException{setValue(Long.valueOf(text)+666L);}});}@GetMapping("/index")publicObjectindex(Longid){return"index-"+id;}}请注意以下几点:使用@InitBinder注释。接收WebDataBinder参数。注册自定义转换器。方法返回值必须为空。在上面的示例中,注册了一个类型转换器,用于将String类型转换为Long类型,并将原始值加上666L。原理解读HandlerAdapter执行。public类RequestMappingMappingHandlerAdapter扩展了AbsTracThandLermetHodAdapter的beanfactoryaware,InitializeBean{受保护的modelAndViewInvokeHandLermEthod(httpservletrequestrequest,httpservletRequestrequest,httpservletletlectletsponseponse响应)binderFactory=getDataBinderFactory(handlerMethod);ServletInvocableHandlerMethodinvocableMethod=createInvocableHandlerMethod(handlerMethod);invocableMethod.invokeAndHandle(webRequest,mavContainer);//...}}ServletInvocableHandlerMethod执行。publicclassServletInvocableHandlerMethodextendsInvocableHandlerMethod{publicvoidinvokeAndHandle(ServletWebRequestwebRequest,ModelAndViewContainermavContainer,Object...providedArgs)throwsException{//调用父类方法ObjectreturnValue=invokeForRequest(webRequest,mavContainer,providedArgs);//...}}//执行父类方法调用publicclassInvocableHandlerMethodextendsHandlerMethod{publicObjectinvokeForRequest(NativeWebRequestrequest,@NullableModelAndViewContainermavContainer,Object...providedArgs)throwsException{Object[]args=getMethodArgumentValues(request,mavContainer,providedArgs);返回doInvoke(args);}protectedObject[]getMethodArgumentValues(NativeWebRequestrequest,@NullableModelAndViewContainermavContainer,Object...providedArgs)throwsException{Object[]args=newObject[parameters.length];for(inti=0;i
