Spring MVC(非Spring Boot)集成Springdoc-openapi启动异常求助
Spring非Boot WAR应用迁移Springdoc-openapi启动失败排查
问题背景
现有一个打包为WAR的Spring应用,从Swagger 2迁移至Springdoc-openapi后无法正常启动。
当前配置
@Configuration @ComponentScan(basePackages = {"org.springdoc"}) @EnableWebMvc @Import({SpringDocConfiguration.class, SpringDocWebMvcConfiguration.class, org.springdoc.webmvc.ui.SwaggerConfig.class, SwaggerUiConfigProperties.class, SwaggerUiOAuthProperties.class, JacksonAutoConfiguration.class}) public class OpenApiConfiguration implements WebMvcConfigurer { @Bean public OpenAPI openAPI() { return new OpenAPI(); } }
依赖配置(spring.version=6.0.11)
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring.version}</version> <type>pom</type> <scope>import</scope> </dependency>
启动错误日志
2023-08-08 17:01:40,702 [RMI TCP Connection(2)-127.0.0.1] ERROR org.springframework.web.context.ContextLoader - [] Context initialization failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'openApiWebMvcResource' defined in URL [jar:file:/Users/.../WEB-INF/lib/springdoc-openapi-starter-webmvc-api-2.1.0.jar!/org/springdoc/webmvc/api/OpenApiWebMvcResource.class]: Unsatisfied dependency expressed through constructor parameter 5: Error creating bean with name 'springDocProviders' defined in org.springdoc.core.configuration.SpringDocConfiguration: Unsatisfied dependency expressed through method 'springDocProviders' parameter 3: Error creating bean with name 'springRepositoryRestResourceProvider' defined in org.springdoc.core.configuration.SpringDocDataRestConfiguration$SpringRepositoryRestResourceProviderConfiguration: Unsatisfied dependency expressed through method 'springRepositoryRestResourceProvider' parameter 0: No qualifying bean of type 'org.springframework.data.rest.core.mapping.ResourceMappings' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:245) ~[spring-beans-6.0.11.jar:6.0.11] ... Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springDocProviders' defined in org.springdoc.core.configuration.SpringDocConfiguration: Unsatisfied dependency expressed through method 'springDocProviders' parameter 3: Error creating bean with name 'springRepositoryRestResourceProvider' defined in org.springdoc.core.configuration.SpringDocDataRestConfiguration$SpringRepositoryRestResourceProviderConfiguration: Unsatisfied dependency expressed through method 'springRepositoryRestResourceProvider' parameter 0: No qualifying bean of type 'org.springframework.data.rest.core.mapping.ResourceMappings' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:550) ~[spring-beans-6.0.11.jar:6.0.11] at ... Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springRepositoryRestResourceProvider' defined in org.springdoc.core.configuration.SpringDocDataRestConfiguration$SpringRepositoryRestResourceProviderConfiguration: Unsatisfied dependency expressed through method 'springRepositoryRestResourceProvider' parameter 0: No qualifying bean of type 'org.springframework.data.rest.core.mapping.ResourceMappings' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-6.0.11.jar:6.0.11]
已尝试方案
- 添加
@ComponentScan(basePackages = {"org.springdoc"})配置,无效 - 参考Stack Overflow上非Boot项目集成Springdoc的案例,但报错场景不同,无法解决
解决方案建议
1. 排除Spring Data Rest相关自动配置
报错核心是Springdoc自动尝试创建springRepositoryRestResourceProvider,但项目未使用Spring Data Rest,缺少ResourceMappings Bean。修改配置排除相关类:
@Configuration @ComponentScan(basePackages = {"org.springdoc"}, excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SpringDocDataRestConfiguration.class)}) @EnableWebMvc @Import({SpringDocConfiguration.class, SpringDocWebMvcConfiguration.class, org.springdoc.webmvc.ui.SwaggerConfig.class, SwaggerUiConfigProperties.class, SwaggerUiOAuthProperties.class, JacksonAutoConfiguration.class}) public class OpenApiConfiguration implements WebMvcConfigurer { @Bean public OpenAPI openAPI() { return new OpenAPI(); } }
2. 修复Spring版本冲突
依赖中spring-webmvc版本为4.1.2,与Spring 6.0.11严重不兼容,统一Spring版本:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
3. 简化Springdoc配置
非Spring Boot项目无需手动导入过多配置类,精简后配置如下:
@Configuration @EnableWebMvc @ComponentScan(basePackages = {"org.springdoc"}) public class OpenApiConfiguration implements WebMvcConfigurer { @Bean public OpenAPI openAPI() { return new OpenAPI(); } }
内容的提问来源于stack exchange,提问作者Philip Lowney
相关产品推荐
相关产品推荐

