Springboot2.6.x高版本与Swagger2版本冲突问题解决方法

网友投稿 869 2022-08-14


Springboot2.6.x高版本与Swagger2版本冲突问题解决方法

目录问题: 原因完整解决方案:

问题:

Spring Boot 2.6.x版本引入依赖 springfox-boot-starter (Swagger 3.0) 后,启动容器会报错:

Failed to start bean ‘ documentationPluginsBootstrapper ‘ ; nested exception…

原因

Springfox 假设 Spring MVC 的路径匹配策略是 ant-path-matcher,而 Spring Boot 2.6.x版本的默认匹配策略是 path-pattern-matcher,这就造成了上面的报错。

完整解决方案:

1. pom配置

org.springframework.boot

spring-boot-starter-web

2.6.4

io.springfoxIPoIaK

springfox-boot-starter

3.0.0

2. 添加Bean

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.config.BeanPostProcessor;

import org.springframework.stereotype.Component;

import org.springframework.util.ReflectionUtils;

import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;

import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;

import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;

import java.lang.reflect.Field;

import java.util.List;

import java.util.stream.Collectors;

@Component

public class SwaggerBeanPostProcessor implements BeanPostProcessor {

@Override

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider)

{

List handlerMappings = getHandlerMappings(bean);

customizeSpringfoxHandlerMappings(handlerMappings);

}

return bean;

}

private void customizeSpringfoxHandlerMappings(List mappings) {

List copy = mappings.stream()

.filter(mapping -> mapping.getPatternParser() == null)

.collect(Collectors.toList());

mappings.clear();

mappings.addAll(copy);

}

@SuppressWarnings("unchecked")

private Listhttp:// getHandlerMappings(Object bean) {

try {

Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");

field.setAccessible(true);

return (List) field.get(bean);

}

catch (IllegalArgumentException | IllegalAccessException e) {

throw new IllegalStateException(e);

}

}

}

3. swagger配置类继承 WebMvcConfigurationSupport

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

@Configuration

public class Swagger2Config extends WebMvcConfigurationSupport {

@Bean

public Docket createRestApi() {

return new Docket(DocumentationType.SWAGGER_2)

.apiInfo(ApiInfo.DEFAULT);

}

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.

addResourceHandler("/swagger-ui/**")

.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")

.resourceChain(false);

}

}

4. 访问 http://{ip}:{port}/swagger-ui/index.html

当然还是要感谢技术大佬,我只会汇总解决了治本的完整解决方法


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中文件的读写方法之IO流详解
下一篇:Java实战之课程在线学习系统的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~