记录 io.springfox 3.0.0 整合 spring boot 2.6.x 由于 springfox bug 引发问题

首先第一个问题就是不兼容:

解决方案:

java 复制代码
	@Bean
	public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
	    return new BeanPostProcessor() {

	        @Override
	        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
	            if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
	                customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
	            }
	            return bean;
	        }

	        private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
	            List<T> copy = mappings.stream()
	                    .filter(mapping -> mapping.getPatternParser() == null)
	                    .collect(Collectors.toList());
	            mappings.clear();
	            mappings.addAll(copy);
	        }

	        @SuppressWarnings("unchecked")
	        private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
	            try {
	                Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
	                field.setAccessible(true);
	                return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
	            } catch (IllegalArgumentException | IllegalAccessException e) {
	                throw new IllegalStateException(e);
	            }
	        }
	    };
	}

其二增加配置:

复制代码
spring:
  mvc:
    pathmatch:
      matching-strategy: ANT_PATH_MATCHER  

而其中 springfox 中的一个 bug 就是,你在使用注解:paramType 由于没有使用指定的类型:path、query、body、header和form 导致启动解析的时候 enum 直接异常,导致整个项目所有注解都没有加载到系统内。解决办法:

  1. 把不正确的地方修改。

2.修改源码

源码修改如下:

java 复制代码
@Component
@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER)
@SuppressWarnings("deprecation")
public class OperationImplicitParametersReader implements OperationBuilderPlugin {
	private static final Logger LOGGER = LoggerFactory.getLogger(OperationImplicitParametersReader.class);
	
	private final DescriptionResolver descriptions;

	@Autowired
	public OperationImplicitParametersReader(DescriptionResolver descriptions) {
		this.descriptions = descriptions;
	}

	@Override
	public void apply(OperationContext context) {
		List<Compatibility<springfox.documentation.service.Parameter, RequestParameter>> parameters
		= readParameters(context);
		context.operationBuilder().parameters(parameters.stream()
				.map(Compatibility::getLegacy)
				.filter(Optional::isPresent)
				.map(Optional::get)
				.collect(Collectors.toList()));
		context.operationBuilder().requestParameters(parameters.stream()
				.map(Compatibility::getModern)
				.filter(Optional::isPresent)
				.map(Optional::get)
				.collect(Collectors.toList()));
	}

	@Override
	public boolean supports(DocumentationType delimiter) {
		return pluginDoesApply(delimiter);
	}

	private List<Compatibility<springfox.documentation.service.Parameter, RequestParameter>>
	readParameters(OperationContext context) {
		List<ApiImplicitParams> annotations = context.findAllAnnotations(ApiImplicitParams.class);

		List<Compatibility<springfox.documentation.service.Parameter, RequestParameter>> parameters = new ArrayList<>();
		if (!annotations.isEmpty()) {
			for (ApiImplicitParams annotation : annotations) {
				for (ApiImplicitParam param : annotation.value()) {
					Compatibility  compatibility = null;
					try {
						compatibility = OperationImplicitParameterReader.implicitParameter(descriptions, param);
					}catch(Exception e) {
						LOGGER.error(String.format("Unable to scan documentation Compatibility- ApiImplicitParam %s", param.value()), e);
						continue;
					}
					parameters.add(compatibility);
				}
			}
		}
		return parameters;
	}
}

关键修改:

Compatibility compatibility = null;

try {

compatibility = OperationImplicitParameterReader.implicitParameter(descriptions, param);

}catch(Exception e) {//在这个地方补货异常,并将异常处理,不往上抛

LOGGER.error(String.format("Unable to scan documentation Compatibility- ApiImplicitParam %s", param.value()), e);

continue;

}

parameters.add(compatibility);

相关推荐
seventeennnnn20 分钟前
谢飞机的Java高级开发面试:从Spring Boot到分布式架构的蜕变之旅
spring boot·微服务架构·java面试·分布式系统·电商支付
超级小忍2 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
时间会给答案scidag2 小时前
报错 400 和405解决方案
vue.js·spring boot
Wyc724093 小时前
SpringBoot
java·spring boot·spring
love530love3 小时前
Docker 稳定运行与存储优化全攻略(含可视化指南)
运维·人工智能·windows·docker·容器
ladymorgana4 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
GJCTYU6 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
风象南7 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
1024小神8 小时前
tauri项目在windows上的c盘没有权限写入文件
c语言·开发语言·windows
写不出来就跑路8 小时前
暑期实习感悟与经验分享:从校园到职场的成长之路
java·开发语言·经验分享·spring boot