前言
公司的新架构使用了springdoc和springboot3.4.1,接口文档想使用swagger进行接口文档的管理,但是启动之后swagger文档无法正常展示访问,提示了GenericResponseService第693行左右无法创建ControllerAdviceBean的实例,或者是创建ControllerAdviceBean时参数不正确。
问题原因
springboot 3.4.1的ControllerAdviceBean类的构造方法删除了原先的
ControllerAdviceBean(String beanName, @Nullable BeanFactory beanFactory) 构造方法,
只提供了新的
ControllerAdviceBean(String beanName, BeanFactory beanFactory, ControllerAdvice controllerAdvice) 构造方法,这里springdoc旧的GenericResponseService类无法正常调用ControllerAdviceBean的构造方法导致了问题的出现。
解决方案
在自己的源代码中新建同GenericResponseService类的包与类覆盖springdoc的类,将原有的692行
controllerAdviceInfosNotInThisBean的获取
的获取改为
List<ControllerAdviceInfo> controllerAdviceInfosNotInThisBean = controllerAdviceInfos.stream()
.filter(controllerAdviceInfo -> {
// 解決springdoc不兼容springboot3.4.1问题
if (controllerAdviceInfo.getControllerAdvice() instanceof ControllerAdvice controllerAdvice) {
return new ControllerAdviceBean(controllerAdvice.name(), propertyResolverUtils.getFactory(), controllerAdvice).isApplicableToBeanType(beanType);
}else {
return false;
}
})
.filter(controllerAdviceInfo -> !beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
.toList();