spring mvc参数解析 (六)HandlerMethodArgumentResolver

前面已经大致分析了整个解析过程,现在看看扩展点,主要分为两部分
第一个是@InitBinder注解的方法,这个注解可以有value,这个value是有用的下面会说明
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第1张图片
这个方法里面可以添加自定义的校验器,可以添加自定义的PropertyEditor,可以设置fieldDefaultPrefix这个属性的作用下面说明,
先说校验器,spring 会默认添加一个校验器是hibernate的
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第2张图片
这个里面最终会调用constraintvalidators进行校验,如果在这里添加校验器回调调用ValidatorImpl之后调用自定义的校验器。

调用校验器的代码在ModelAttributeMethodProcessor这个类里面在绑定完参数之后开始执行
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第3张图片
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第4张图片
那么binder为什么会有初始化的validatorImpl的这个要看databinder的创建过程,这个在前面已经说过了,主要是在WebBindingInitializer初始化databinder添加的,这个类后面讲
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第5张图片
这个就是大概的校验逻辑
在说@initbinder的哪个value值
这个value值主要是在initBinder(dataBinder, webRequest);这个方法里面是否需要执行方法做判断用的
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第6张图片
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第7张图片
从这里就可以看出如果没有value会默认执行,如果有value则当前参数的名称必须包含value,这个方法里面的name是之前解析的当前参数的name,这有个好处
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第8张图片
这个好处是在解析user的时候只会执行@InitBinder(“user”)方法,在解析user1的时候只会执行@InitBinder(“user1”)标记的方法。***但是这是加了@ModelAttribute并且指定了value,
如果没有加@ModelAttribute这个标记或者加了没有指定name则只会都执行@InitBinder(“user”)方法,应为在解析user1的时候,解析出来的name依然回事user***具体的可以看我之前的文章有说明。

再说fieldDefaultPrefix,这个属性在网上的资料很多的也比较好理解,可以看看这个地址https://blog.csdn.net/zhenghuangyu/article/details/83446278。我这里看看源码,
在解析参数的过程中会经过下面这个方法
spring mvc参数解析 (六)HandlerMethodArgumentResolver_第9张图片
这个方法很好理解 比如request中具有user.name=kjk cat.name=tom,如果在解析user的时候设置了fieldDefaultPrefix=“user”,那么经过这个方法之后request中就会变成name=“kjk” cat.name=tom,这样就会将user.name 值放在user这个对象的name属性中。相应的解析cat这个对象的时候经过这个方法request中就会变成 user.name=kjk name=tom.

你可能感兴趣的:(spring,mvc)