栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

完美解决自定义 WebMvcConfigurationSupport 只能允许一个实例和Swagger冲突问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

完美解决自定义 WebMvcConfigurationSupport 只能允许一个实例和Swagger冲突问题

先把配置文件发出来,只需这个配置文件就可以

@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 List getDefaultArgumentResolvers() {
        List resolvers = new ArrayList(30);
        resolvers.add(new RequestParamMethodArgumentResolver(this.getBeanFactory(), false));
        resolvers.add(new RequestParamMapMethodArgumentResolver());
        resolvers.add(new PathVariableMethodArgumentResolver());
        //...
}

所以我们只需要把这个存放解释器的数组拿出来重新新建一个ArrayList把数据复制进去,再插入自定义解释器,再设置回Adapter即可。即文章开头的配置文件代码。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/343124.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号