knife4j+springboot3.4异常无法正确展示文档

场景复现:

  • knife4j-openapi3-jakarta-spring-boot-starter版本

    com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter 4.5.0
  • 原来使用springboot3.3.5版本,先升级到3.4.0版本

  • 通过http://ip:port/doc.html访问接口文档发现访问/v3/api-docs接口时报

    Handler dispatch failed: java.lang.NoSuchMethodError: 'void org.springframework.web.method.ControllerAdviceBean.(java.lang.Object)

通过分析异常日志发现是ControllerAdviceBean类报错,在springboot3.3.5时spring-web版本是6.1.14,springboot3.4版本是6.2.0版本。

通过springboot全局异常捕获堆栈信息发现:

org.springdoc.core.service.GenericResponseService.lambda$getGenericMapResponse$8(GenericResponseService.java:702)

GenericResponseService类是在如下包:

<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-common -->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-common</artifactId>
    <version>2.3.0</version>
</dependency>

GenericResponseService类的702行代码如下(ControllerAdviceBean类使用一个参数的构造函数,但是报异常):

List<ControllerAdviceInfo> controllerAdviceInfosNotInThisBean = controllerAdviceInfos.stream()
					.filter(controllerAdviceInfo ->
							new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
					.filter(controllerAdviceInfo -> !beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
					.toList();

spring-web6.1.14版本中ControllerAdviceBean的构造函数:

	public ControllerAdviceBean(Object bean) {
		Assert.notNull(bean, "Bean must not be null");
		this.beanOrName = bean;
		this.isSingleton = true;
		this.resolvedBean = bean;
		this.beanType = ClassUtils.getUserClass(bean.getClass());
		this.beanTypePredicate = createBeanTypePredicate(this.beanType);
		this.beanFactory = null;
	}

spring-web6.2.0版本中ControllerAdviceBean的构造函数:

	public ControllerAdviceBean(String beanName, BeanFactory beanFactory, ControllerAdvice controllerAdvice) {
		Assert.hasText(beanName, "Bean name must contain text");
		Assert.notNull(beanFactory, "BeanFactory must not be null");
		Assert.isTrue(beanFactory.containsBean(beanName), () -> "BeanFactory [" + beanFactory +
				"] does not contain specified controller advice bean '" + beanName + "'");
		Assert.notNull(controllerAdvice, "ControllerAdvice must not be null");

		this.beanName = beanName;
		this.isSingleton = beanFactory.isSingleton(beanName);
		this.beanType = getBeanType(beanName, beanFactory);
		this.beanTypePredicate = createBeanTypePredicate(controllerAdvice);
		this.beanFactory = beanFactory;
	}

此类中的构造函数已经变更为4个,已经不存在一个参数的构造函数了。

  • springdoc-openapi-starter-common文档当前已经升级到2.7.0版本

    org.springdoc springdoc-openapi-starter-common 2.7.0

结论:期待knife4j-openapi3-jakarta-spring-boot-starter早日升级,兼容最新版本的spring;

开源SDK:https://github.com/mingyang66/spring-parent

<think>好的,我需要帮助用户解决在Spring Boot 3中集成Knife4j的问题,或者解决相关的常见问题。首先,我得确认Knife4j的最新版本是否支持Spring Boot 3,因为Spring Boot 3需要Jakarta EE 9+,这可能会导致一些依赖冲突。 首先,用户需要添加正确的Maven依赖。可能之前的Knife4j版本不支持Spring Boot 3,所以应该检查官方文档是否有更新。假设最新版本是4.x,支持Spring Boot 3,那么依赖配置可能需要调整,比如使用新的groupId或者artifactId。 然后,配置类需要适配Spring Boot 3的变化,比如包名从javax迁移到jakarta。在创建Docket bean时,需要注意这些包的变化,否则可能会报错。此外,Knife4j的配置类可能需要启用新的注解,比如@EnableKnife4j或者其他的配置方式。 接下来,用户可能需要配置静态资源的映射,因为Spring Boot 3的静态资源处理可能有变化。需要确保Knife4j的接口文档能够正常访问,可能需要添加资源处理器来排除拦截。 另外,常见问题可能包括依赖冲突,比如旧版本的Knife4j可能依赖了不支持Jakarta的库,导致启动失败。需要排除这些冲突,或者升级相关依赖。 还有,用户可能会遇到访问接口文档页面空白的问题,这可能是因为Spring Security的配置拦截了相关路径,需要添加放行规则。或者,Knife4j的路径配置不正确,需要检查配置文件中的路径是否匹配。 最后,测试集成是否成功,访问正确的URL,比如/doc.html,并验证接口文档是否正确生成。如果出现问题,查看日志中的错误信息,比如缺少类或注解,可能需要调整依赖或配置。 需要一步步引导用户完成依赖添加、配置类编写、资源处理、解决常见问题等,确保每个步骤都正确无误,并给出示例代码和配置,方便用户直接参考使用。</think>### 在Spring Boot 3中集成Knife4j的步骤 #### 1. 添加依赖 确保使用支持Spring Boot 3Knife4j版本(推荐4.x+)。在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.3.0</version> </dependency> ``` 注意:Spring Boot 3使用Jakarta EE 9+,因此必须选择适配的Knife4j依赖[^1]。 #### 2. 配置OpenAPI 在`application.yml`中添加基础配置: ```yaml springdoc: swagger-ui: path: /swagger-ui.html tags-sorter: alpha operations-sorter: alpha api-docs: path: /v3/api-docs group-configs: - group: default paths-to-match: /api/** ``` #### 3. 创建配置类 编写Java配置类启用Knife4j: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; @Configuration public class Knife4jConfig { @Bean public OpenAPI springShopOpenAPI() { return new OpenAPI() .info(new Info() .title("API文档") .description("Spring Boot 3集成Knife4j示例") .version("1.0")); } } ``` #### 4. 处理静态资源(可选) 若访问文档页面空白,添加资源映射: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } } ``` #### 5. 验证访问 启动应用后访问: - Knife4j增强文档:`http://localhost:8080/doc.html` - OpenAPI原生文档:`http://localhost:8080/v3/api-docs` --- ### 常见问题解决 #### 1. 启动报错`javax.servlet`类找不到 **原因**:Spring Boot 3使用Jakarta EE 9+,需确保所有依赖已适配。 **解决**:检查依赖是否包含`jakarta`关键字,排除旧版`javax.servlet`依赖。 #### 2. 文档页面空白 **原因**:静态资源未正确映射或Spring Security拦截。 **解决**: - 添加静态资源映射(见步骤4) - 若使用Spring Security,放行相关路径: ```java @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests(auth -> auth .requestMatchers("/doc.html", "/webjars/**", "/v3/api-docs/**").permitAll() .anyRequest().authenticated() ); return http.build(); } ``` #### 3. 接口分组不生效 **解决**:通过`@Tag`注解显式定义分组: ```java @RestController @Tag(name = "用户管理", description = "用户相关接口") public class UserController { @GetMapping("/users") @Operation(summary = "查询用户列表") public List<User> list() { /* ... */ } } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值