先把配置文件发出来,只需这个配置文件就可以
@Configuration
public class CustomWebMvcArgumentResolvers {
@Autowired
RequestMappingHandlerAdapter requestMappingHandlerAdapter;
@Bean
public RequestListVoHandlerMethodArgumentResolver requestListVoHandlerMethodArgumentResolver() {
//自定义解释器
RequestListVoHandlerMethodArgumentResolver resolver = new RequestListVoHandlerMethodArgumentResolver();
//往spring解释器池添加自定义解释器
List list = new ArrayList<>(requestMappingHandlerAdapter.getArgumentResolvers());
//注意此处数组索引为0目的是解释器执行顺序问题
list.add(0, resolver);
//重新设置spring解释器池
requestMappingHandlerAdapter.setArgumentResolvers(list);
return resolver;
}
}
遇到问题:
1.在实现自定义参数解释器时,网上找到的答案都是新建一个继承 WebMvcConfigurationSupport 的配置文件,但实现后发现,与spring原有的 org.springframework.boot.autoconfigure.web.servletWebMvcAutoConfiguration.EnableWebMvcConfiguration 类有冲突,导致swagger无法正确访问,查看这个文件源码
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter(@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager, @Qualifier("mvcConversionService") FormattingConversionService conversionService, @Qualifier("mvcValidator") Validator validator) {
RequestMappingHandlerAdapter adapter = this.createRequestMappingHandlerAdapter();
adapter.setContentNegotiationManager(contentNegotiationManager);
adapter.setMessageConverters(this.getMessageConverters());
adapter.setWebBindingInitializer(this.getConfigurableWebBindingInitializer(conversionService, validator));
adapter.setCustomArgumentResolvers(this.getArgumentResolvers());
adapter.setCustomReturnValueHandlers(this.getReturnValueHandlers());
if (jackson2Present) {
adapter.setRequestBodyAdvice(Collections.singletonList(new JsonViewRequestBodyAdvice()));
adapter.setResponseBodyAdvice(Collections.singletonList(new JsonViewResponseBodyAdvice()));
}
AsyncSupportConfigurer configurer = this.getAsyncSupportConfigurer();
if (configurer.getTaskExecutor() != null) {
adapter.setTaskExecutor(configurer.getTaskExecutor());
}
if (configurer.getTimeout() != null) {
adapter.setAsyncRequestTimeout(configurer.getTimeout());
}
adapter.setCallableInterceptors(configurer.getCallableInterceptors());
adapter.setDeferredResultInterceptors(configurer.getDeferredResultInterceptors());
return adapter;
}
这里实例化了一个Bean: RequestMappingHandlerAdapter 这个Adapter即是存放参数解释器的容器,所以我们直接往这个容器添加自定义解释器即可.
2.在配置文件Autowire RequestMappingHandlerAdapter 调用add方法时候添加解释器时,系统报错java.lang.UnsupportedOperationException 无法操作数据,查看源码可得只,起数组是一个不能操作的数组实例
private ListgetDefaultArgumentResolvers() { List resolvers = new ArrayList(30); resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), false)); resolvers.add(new RequestParamMapMethodArgumentResolver()); resolvers.add(new PathVariableMethodArgumentResolver()); //... }
所以我们只需要把这个存放解释器的数组拿出来重新新建一个ArrayList把数据复制进去,再插入自定义解释器,再设置回Adapter即可。即文章开头的配置文件代码。



