springMvc HandlerMethodArgumentResolver

SpringMvc 在配置多个mvc:argument-resolvers(目前是分开在不同的配置文件)

会出现覆盖问题;

实际spring容器中只会有一个文件里配置的bean

原因

debug 后发现,MVC实际是在调用一个name为org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterRequestMappingHandlerAdapter 同时多个配置文件会导致初始化多个RequestMappingHandlerAdapter,但是其他name的都没有用

解决方案

结合RequestMappingHandlerAdapter存储HandlerMethodArgumentResolver的原理

自定义类如下

1package com.hui.handler; 2 3import org.slf4j.Logger; 4import org.slf4j.LoggerFactory; 5import org.springframework.beans.factory.InitializingBean; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.context.ApplicationContext; 8import org.springframework.core.MethodParameter; 9import org.springframework.stereotype.Component; 10import org.springframework.web.bind.support.WebDataBinderFactory; 11import org.springframework.web.context.request.NativeWebRequest; 12import org.springframework.web.method.support.HandlerMethodArgumentResolver; 13import org.springframework.web.method.support.ModelAndViewContainer; 14import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; 15 16import javax.annotation.Resource; 17import java.util.ArrayList; 18import java.util.List; 19 20/** 21 * 处理注入参数处理 22 * <p>当在多个context.xml中配置arm -resolver时,会因为加载顺序导致覆盖问题</p> 23 * 24 * @author 墨盒 25 * @date 19-4-9 26 */ 27public abstract class AbstractResolverHandler implements HandlerMethodArgumentResolver, InitializingBean { 28 29 protected Logger logger = LoggerFactory.getLogger(getClass()); 30 31 @Resource(name = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter") 32 protected RequestMappingHandlerAdapter adapter; 33 34 @Override 35 public void afterPropertiesSet() throws Exception { 36 if (!adapter.getArgumentResolvers().contains(this)) { 37 List<HandlerMethodArgumentResolver> list = adapter.getArgumentResolvers(); 38 List<HandlerMethodArgumentResolver> nList = new ArrayList<>(list.subList(0, list.size() - 2));//原list为不可修改list,因此需要重新new一个普通list,同时可在此调整顺序 39 nList.add(this);//必须放过最后两个 40 nList.addAll(list.subList(list.size() - 2, list.size())); 41 adapter.setArgumentResolvers(nList); 42 43 } 44 //查看此时bean里注册的数据 45// String[] names = context.getBeanDefinitionNames(); 46// for (int i = 0; i < names.length; i++) { 47// logger.debug("name={},class={}", names[i], context.getBean(names[i])); 48// } 49 50 } 51 52 @Override 53 public abstract boolean supportsParameter(MethodParameter parameter); 54 55 @Override 56 public abstract Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception; 57} 58

使用方法

继承该类,并将其托管到springMVC容器即可

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang