SpringMvc 在配置多个mvc:argument-resolvers(目前是分开在不同的配置文件)
会出现覆盖问题;
实际spring容器中只会有一个文件里配置的bean
原因
debug 后发现,MVC实际是在调用一个name为org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 的RequestMappingHandlerAdapter 同时多个配置文件会导致初始化多个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容器即可