什么时候知道的该取调用initBinder();
HandlerMethodArgumentResolver(暂且将其命名翻译为方法参数解析器),是一个负责将上下文请求的参数值解析入请求方法的参数中 具体的解析器列表如下:
1. RequestParamMethodArgumentResolver
2. RequestParamMapMethodArgumentResolver
3. PathVariableMethodArgumentResolver
4. PathVariableMapMethodArgumentResolver
5. MatrixVariableMethodArgumentResolver
6. MatrixVariableMapMethodArgumentResolver
7. ServletModelAttributeMethodProcessor
8. RequestResponseBodyMethodProcessor
9. RequestPartMethodArgumentResolver
10. RequestHeaderMethodArgumentResolver
11. RequestHeaderMapMethodArgumentResolver
12. ServletCookieValueMethodArgumentResolver
13. ExpressionValueMethodArgumentResolver
14. SessionAttributeMethodArgumentResolver
15. RequestAttributeMethodArgumentResolver
16. ServletRequestMethodArgumentResolver
17. ServletResponseMethodArgumentResolver
18. HttpEntityMethodProcessor
19. RedirectAttributesMethodArgumentResolver
20. ModelMethodProcessor
21. MapMethodProcessor
22. ErrorsMethodArgumentResolver
23. SessionStatusMethodArgumentResolver
24. UriComponentsBuilderMethodArgumentResolver
25. RequestParamMethodArgumentResolver
26. ServletModelAttributeMethodProcessor
关于HandlerMethodArgumentResolver 的介绍可以参考https://www.jianshu.com/p/f4653fe8c935
当一个controller 内部存在两个方法时
@RequestMapping("bind1")
public String bind1(){
return "";
}
@RequestMapping("bind2")
public String bind2(Form form){
return form.toString();
}
第一个方法再进行调用的时候,命中的策略实现是ServletRequestMethodArgumentResolver
而对第二个方法进行调用的时候,命中的策略实现是ServletModelAttributeMethodProcessor
因为命中的策略不同导致执行的逻辑有所不同,所以后者bind2 进行了initBinder
方法参数解析器是在什么时候配置的呢?
1ServletModelAttributeMethodProcessor的父类ModelAttributeMethodProcessor 在解析参数的时候通过binderFactory 临时创建WebDataBinder.
2binderFactory创建完实例后,通过预先准备好的binderMethods进行进一步的设置,这是springmvc 留给使用者的扩展
在对接第三方接口的时候,常常需要通过回调来改变用户状态,但是很多回调并非遵循java的命名规范,譬如常常以 _ 开始,而springmvc遇到此类参数默认将其置空,我们可以通过改变WebDataBinder的默认设置,使得以 开头的参数也能享受springmvc 的参数绑定。 至于springmvc 为什么要把 开头的参数置空,仍然是一个值得探讨的问题。
具体的做法如下在controller 内部定义如下方法:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setFieldMarkerPrefix(null);
}
最后留个疑问ControllerAdvice 中也能设置initBinder,并且他是全局的,而在controller内部的initBinder是临时的,springmvc如何解决优先性问题呢,如何统一二者的调用逻辑呢?@InitBinder是如何扫描到的呢?initBinder本身对于每个方法并非单例的,很多问题值得我们探索