HandlerMethodArgumentResolver数据绑定无效

因项目中action参数过多,并且是一些通用的查询参数,所以准备进行对参数统一封装为Map对象,然后由action中传入service中进行处理,查询spring的资料发现可以通过实现HandlerMethodArgumentResolver进行数参数的绑定,参考文章《扩展SpringMVC以支持更精准的数据绑定1》进行配置后。

项目调试中发现断点不能正常进行解析器,跟踪源代码找到在org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.getArgumentResolver()方法中会获取所有已经加载的解析器,会顺序执行,而我使用的Map对象会被spring自带的解析器给处理掉,所以自定义的解析器无法进入,HandlerMethodArgumentResolverComposite关键代码:

    private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
        HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
        if (result == null) {
            for (HandlerMethodArgumentResolver methodArgumentResolver : this.argumentResolvers) {
                if (logger.isTraceEnabled()) {
                    logger.trace("Testing if argument resolver [" + methodArgumentResolver + "] supports [" +
                            parameter.getGenericParameterType() + "]");
                }
                if (methodArgumentResolver.supportsParameter(parameter)) {
                    result = methodArgumentResolver;
                    this.argumentResolverCache.put(parameter, result);
                    break;
                }
            }
        }
        return result;
    }

其中this.argumentResolvers为LinkedList变量,元素内容:

[org.springfra[email protected]9dc12fc,
org.springframew[email protected]23c893fc,
org.springframework.web.s[email protected]456b97be,
org.springframework.web.serv[email protected]1ab75e8d,
org.springframework.web.ser[email protected]7ca088ae,
org.springframework.web.servle[email protected]f6d976e,
org.springframework.web.ser[email protected]63f0beab,
org.springframework.web.s[email protected]5275ffcf,
org.springframework.web.[email protected]40ed9954,
org.springfram[email protected]2eed7b19,
org.springframewo[email protected]692cbe60,
org.springframework.web.servlet[email protected]7886c691,
org.springframew[email protected]58569768,
org.springframework.web.ser[email protected]1cee5a27,
org.springframework.web.serv[email protected]6460c547,
org.springframew[email protected]d37ebcd,
org.springframework.web.servlet[email protected]5259e682,
[email protected]2c8b0b,
[email protected]c856b,
org.spr[email protected]7a3b54cf,
org.springfram[email protected]4d3d20ba,
org.springframework.web.servlet.m[email protected]682fbaf3,
[email protected],
org.springfra[email protected]6a2063e7,
org.springframework.web.ser[email protected]747f091f]

红色标注出来的RequestParamMapMethodArgumentResolver为处理Map参数的解析器,处理关键代码:

    public boolean supportsParameter(MethodParameter parameter) {
        RequestParam requestParamAnnot = parameter.getParameterAnnotation(RequestParam.class);
        if (requestParamAnnot != null) {
            if (Map.class.isAssignableFrom(parameter.getParameterType())) {
                return !StringUtils.hasText(requestParamAnnot.value());
            }
        }
        return false;
    }
Map.class.isAssignableFrom会拦截实现Map接口的参数,所以我自定义的解析器始终无法断点进入。
时间: 2024-10-28 12:01:22

HandlerMethodArgumentResolver数据绑定无效的相关文章

ListBox数据绑定无效

public class DataList { public List<string> listSource; private DataTable table; public DataList() { table = new DataTable(); table.Columns.Add("column0"); table.Columns.Add("column1"); DataRow row = table.NewRow(); row[0] = &quo

vue数据绑定html

html标签的纯文本显示/被当做html标签处理: 1)使用两个大括号时,假如字符串内容是html标签,那么不会被转义: 2)使用三个大括号时,字符串内的html标签会被直接转义 a.两个大括号: 1 <div id="app"> 2 {{html}} 3 </div> 4 <script> 5 var vm = new Vue({ 6 el:"#app", 7 data: { 8 html:"<span>s

Vuejs——Vue生命周期,数据,手动挂载,指令,过滤器

版权声明:出处http://blog.csdn.net/qq20004604 目录(?)[+] 原教程: http://cn.vuejs.org/guide/instance.html http://cn.vuejs.org/guide/syntax.html 本博文是在原教程的基础上加上实例,并尝试说明的更详细. (十)Vue实例的生命周期 如图:(我自己翻译的中文版,英文版请查看本博文顶部的,第一个链接) (八)传入的数据绑定 先创建一个对象(假如是obj),然后将他传入Vue实例中,作为d

Vuejs——(2)Vue生命周期,数据,手动挂载,指令,过滤器

版权声明:出处http://blog.csdn.net/qq20004604 目录(?)[+] 原教程: http://cn.vuejs.org/guide/instance.html http://cn.vuejs.org/guide/syntax.html 本博文是在原教程的基础上加上实例,并尝试说明的更详细. (十)Vue实例的生命周期 如图:(我自己翻译的中文版,英文版请查看本博文顶部的,第一个链接) (八)传入的数据绑定 先创建一个对象(假如是obj),然后将他传入Vue实例中,作为d

VS2015中DataGridView的DataGridViewComBoboxCell列值无效及数据绑定错误的解决方法

在VS2015中练习DataGridView的使用, 发现其中的DataGridViewComBoboxCell列存在着绑定数据库列后出现值无效的提示 根据网上的解决办法,添加了DataError后可以解决问题,但是数据库列依然不能正常绑定 研究一番后终于明白出错的原因,并找到解决方法: DataGridViewComBoboxCell列绑定的数据要存在列的Item内,不然就会认为是错误值,所以在设置列的DataPropertyName值之前一定要填充列的Item,或者提前设置列的绑定数据,最后

.net WinForm 的数据绑定

.net WinForm 的数据绑定相当灵活 http://www.cnblogs.com/ydong/archive/2006/04/22/381847.html 原来只知道 Control 类上的数据绑定可以直接绑定数据库中的字段.但是它还可绑定所有实现了 IList or IListSource 接口的类的实例.今天写的程序原来是想用 DataBinding, DataSource, ValueMember, DisplayMember 属性来直接绑定表的,但是如果那样做的话就是让界面层直

动态数据绑定之监听对象变化

---恢复内容开始--- 动态数据绑定是MVVM框架中最基础的的一个功能,简单描述就是:将数据和视图进行绑定,当数据发生改变时,视图随之改变,更深层次一点,数据绑定包括单向数据绑定和双向数据绑定. 本文从数据绑定中的问题出发,一步一步的来实现这个功能. 本文的所有的源代码地址: 点击此处查看源代码 问题一 给定任意一个对象,如何监听其属性的读取与变化?也就是说,如何知道程序访问了对象的哪个属性,又改变了哪个属性? 举个例子: let app = new Observer({ name: 'liu

AngularJS笔记---数据绑定

一.数据绑定 1.简单绑定 下面实现了一个简单的加法运算的绑定, A.ng-app:表示该div以内都在AngularJS的应用, 去掉ng-app="" 那么后面的绑定都将无效 B.ng-models :  用于数据绑定, 也就是两个input的里面输入的信息都会绑定到val1和val2变量里面. C.{{ FiledName }}: 双括号也是用于数据的绑定. <!DOCTYPE html> <html> <script src="angul

微信小程序之初探(常见语法 VS vue)常见问题(点击不生效,数据绑定)

最近在调研微信小程序开发,对于一个前端小白来说,在各种框架都还用不熟的情况下,再来开发小程序确实还是不容易. 小程序出来之初,听过演讲,看过一点点儿视频,感觉和angular语法有点相似(PS:那是也是只了解一点点儿angular语法): 近两天开始尝试开发小程序,讲真,语法和angular和vue都很相似,小程序提供的语法现在还算全面,很多方法都有提供: 下面简述一下常用方法的使用: 一:数据绑定: html js 直接把数据写在data里面就行了,这样数据可以直接渲染到页面上, 那么问题来了