记录 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);

相关推荐
weixin_BYSJ19877 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Bs_MoneyMagnet7 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
TimberWill9 小时前
windows终端分屏设置
windows
Bs_MoneyMagnet10 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
陌シ未央ゞ11 小时前
基于BM25算法和RRF实现的混合索引(java版)
人工智能·spring boot·后端·算法
不吃鱼的羊12 小时前
DTC错误状态异常排查
windows
user_admin_god14 小时前
第 01 篇:OpenAI 兼容 API 初探 —— 用 curl 跑通第一次对话
java·人工智能·spring boot·语言模型·devops
小辰爱喝汤16 小时前
基于智能定价的 校园二手交易平台-计算机毕业设计
spring boot·毕业设计·课程设计
hoaxxcj17 小时前
DeepSeek Harness 本地部署与第三方插件排障实录:从 fetch failed 到 preset not found
人工智能·windows·开源·ai agent·deepseek
RuoyiOffice17 小时前
SpringBoot3+Vue3 库存盘点:账面和实盘对不上,差异单怎么走审批再调账
spring boot·vue3·erp·spring boot 3·库存盘点·盘盈盘亏