springmvc InitBinder探讨1

本文主要讨论SpringMVC的initBinder方法,它在方法参数解析中的作用。当控制器内方法被调用时,不同的策略如ServletRequestMethodArgumentResolver和ServletModelAttributeMethodProcessor会影响参数绑定。initBinder允许开发者扩展WebDataBinder的默认行为,例如处理以特定字符开头的参数。文中提出了在对接第三方接口时如何利用initBinder修改参数绑定规则,并提出了关于ControllerAdvice中全局initBinder和控制器内临时initBinder的优先级及调用逻辑的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么时候知道的该取调用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本身对于每个方法并非单例的,很多问题值得我们探索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值