spring-boot-starter-swagger 1.3.0.RELEASE:新增对JSR-303的支持和host的配置

简介

该项目主要利用Spring Boot的自动化配置特性来实现快速的将swagger2引入spring boot应用来生成API文档,简化原生使用swagger2的整合代码。

小工具一枚,欢迎使用和Star支持,如使用过程中碰到问题,可以提出Issue,我会尽力完善该Starter

版本基础

  • Spring Boot:1.5.x
  • Swagger:2.7.x

如何使用

在该项目的帮助下,我们的Spring Boot可以轻松的引入swagger2,主需要做下面两个步骤:

  • pom.xml中引入依赖:
<dependency>
<groupId>com.didispace</groupId>
<artifactId>spring-boot-starter-swagger</artifactId>
<version>1.3.0.RELEASE</version>
</dependency>
  • 在应用主类中增加@EnableSwagger2Doc注解
@EnableSwagger2Doc
@SpringBootApplication
public class Bootstrap {

public static void main(String[] args) {
SpringApplication.run(Bootstrap.class, args);
}

}

默认情况下就能产生所有当前Spring MVC加载的请求映射文档。

参数配置

更细致的配置内容参考如下:

配置示例

swagger.title=spring-boot-starter-swagger
swagger.description=Starter for swagger 2.x
swagger.version=1.3.0.RELEASE
swagger.license=Apache License, Version 2.0
swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html
swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger
swagger.contact.name=didi
swagger.contact.url=http://blog.didispace.com
swagger.contact.email=dyc87112@qq.com
swagger.base-package=com.didispace
swagger.base-path=/**
swagger.exclude-path=/error, /ops/**

配置说明

默认配置

- swagger.title=标题
- swagger.description=描述
- swagger.version=版本
- swagger.license=许可证
- swagger.licenseUrl=许可证URL
- swagger.termsOfServiceUrl=服务条款URL
- swagger.contact.name=维护人
- swagger.contact.url=维护人URL
- swagger.contact.email=维护人email
- swagger.base-package=swagger扫描的基础包,默认:全扫描
- swagger.base-path=需要处理的基础URL规则,默认:/**
- swagger.exclude-path=需要排除的URL规则,默认:空
- swagger.host=文档的host信息,默认:空

host属性从1.3.0.RELEASE开始支持

Path规则说明

swagger.base-pathswagger.exclude-path使用ANT规则配置。

我们可以使用swagger.base-path来指定所有需要生成文档的请求路径基础规则,然后再利用swagger.exclude-path来剔除部分我们不需要的。

比如,通常我们可以这样设置:

management.context-path=/ops

swagger.base-path=/**
swagger.exclude-path=/ops/**, /error

上面的设置将解析所有除了/ops/开始以及spring boot自带/error请求路径。

其中,exclude-path可以配合management.context-path=/ops设置的spring boot actuator的context-path来排除所有监控端点。

分组配置

当我们一个项目的API非常多的时候,我们希望对API文档实现分组。从1.2.0.RELEASE开始,将支持分组配置功能。

分组功能

具体配置内容如下:

- swagger.docket.<name>.title=标题
- swagger.docket.<name>.description=描述
- swagger.docket.<name>.version=版本
- swagger.docket.<name>.license=许可证
- swagger.docket.<name>.licenseUrl=许可证URL
- swagger.docket.<name>.termsOfServiceUrl=服务条款URL
- swagger.docket.<name>.contact.name=维护人
- swagger.docket.<name>.contact.url=维护人URL
- swagger.docket.<name>.contact.email=维护人email
- swagger.docket.<name>.base-package=swagger扫描的基础包,默认:全扫描
- swagger.docket.<name>.base-path=需要处理的基础URL规则,默认:/**
- swagger.docket.<name>.exclude-path=需要排除的URL规则,默认:空

说明:<name>为swagger文档的分组名称,同一个项目中可以配置多个分组,用来划分不同的API文档。

分组配置示例

swagger.docket.aaa.title=group-a
swagger.docket.aaa.description=Starter for swagger 2.x
swagger.docket.aaa.version=1.3.0.RELEASE
swagger.docket.aaa.termsOfServiceUrl=https://gitee.com/didispace/spring-boot-starter-swagger
swagger.docket.aaa.contact.name=zhaiyongchao
swagger.docket.aaa.contact.url=http://spring4all.com/
swagger.docket.aaa.contact.email=didi@didispace.com
swagger.docket.aaa.excludePath=/ops/**

swagger.docket.bbb.title=group-bbb
swagger.docket.bbb.basePackage=com.yonghui

说明:默认配置与分组配置可以一起使用。在分组配置中没有配置的内容将使用默认配置替代,所以默认配置可以作为分组配置公共部分属性的配置。

JSR-303校验注解支持

支持对JSR-303校验注解的展示,如下图所示:

JSR-303校验展示

目前共支持以下几个注解:

  • @NotNull
  • @Max、@Min
  • @Size
  • @Pattern

贡献者


money.jpg
java.lang.IllegalStateException: Error processing condition on com.executor.gateway.config.GrayRibbonConfiguration.metadataAwareRule at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:64) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:181) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:142) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:118) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:328) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:271) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:91) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:692) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:530) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:67) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at com.executor.gateway.ApiGatewayApplication.main(ApiGatewayApplication.java:16) [classes/:na] Caused by: java.lang.IllegalStateException: Failed to introspect Class [springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration] from ClassLoader [sun.misc.Launcher$AppClassLoader@255316f2] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:659) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:556) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:541) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:599) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:718) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:659) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:627) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1488) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1011) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.addBeanTypeForNonAliasDefinition(BeanTypeRegistry.java:194) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.addBeanTypeForNonAliasDefinition(BeanTypeRegistry.java:170) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.addBeanType(BeanTypeRegistry.java:163) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.lambda$updateTypesIfNecessary$2(BeanTypeRegistry.java:150) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_431] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.updateTypesIfNecessary(BeanTypeRegistry.java:148) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.getNamesForType(BeanTypeRegistry.java:114) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:265) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:254) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:196) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:116) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~[spring-boot-autoconfigure-2.0.6.RELEASE.jar:2.0.6.RELEASE] ... 17 common frames omitted Caused by: java.lang.NoClassDefFoundError: org/springframework/web/servlet/HandlerMapping at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_431] at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_431] at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_431] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:641) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] ... 37 common frames omitted Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping at java.net.URLClassLoader.findClass(URLClassLoader.java:387) ~[na:1.8.0_431] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_431] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:359) ~[na:1.8.0_431] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_431] ... 41 common frames omitted 2025-09-26 15:20:03.379 INFO 31364 --- [ main] onfigReactiveWebServerApplicationContext : Closing org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@2787de58: startup date [Fri Sep 26 15:20:02 CST 2025]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@6d3c5255 2025-09-26 15:20:03.380 WARN 31364 --- [ main] o.s.boot.SpringApplication : Unable to close ApplicationContext java.lang.IllegalStateException: Failed to introspect Class [springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration] from ClassLoader [sun.misc.Launcher$AppClassLoader@255316f2] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:659) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:556) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:541) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:599) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:718) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:659) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:627) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1488) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:419) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:389) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:510) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:502) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1196) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.boot.SpringApplication.getExitCodeFromMappedException(SpringApplication.java:884) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.getExitCodeFromException(SpringApplication.java:870) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.handleExitCode(SpringApplication.java:856) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:805) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE] at com.executor.gateway.ApiGatewayApplication.main(ApiGatewayApplication.java:16) [classes/:na] Caused by: java.lang.NoClassDefFoundError: org/springframework/web/servlet/HandlerMapping at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_431] at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_431] at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_431] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:641) ~[spring-core-5.0.10.RELEASE.jar:5.0.10.RELEASE] ... 20 common frames omitted Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping at java.net.URLClassLoader.findClass(URLClassLoader.java:387) ~[na:1.8.0_431] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_431] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:359) ~[na:1.8.0_431] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_431] ... 24 common frames omitted <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.executor</groupId> <artifactId>executor-api-gateway</artifactId> <version>1.0.0</version> <description>api网关模块</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR2</spring-cloud.version> <mybatis.version>1.3.0</mybatis.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency> <!--rabbit mq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.51</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--zookeeper--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-all</artifactId> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.12</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0-jre</version> </dependency> <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--admin ui--> <!-- <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.0.1</version> </dependency>--> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> <!-- JWT支持 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> <!-- 验证支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- WebFlux支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>aliyunmaven</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories> </project>
09-27
<think>我们正在处理的问题是Spring Boot 2.0.6.RELEASE项目中使用springfox-swagger时出现的异常: - Failed to introspect Class [springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration] - Caused by: java.lang.NoClassDefFoundError: org/springframework/web/servlet/HandlerMapping - Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping 根据引用[1][2][3][4]的信息,这些问题通常与Spring Boot版本springfox-swagger版本之间的兼容性有关。特别是,在Spring Boot 2.6.x及更高版本中,由于路径匹配策略的默认更改(从AntPathMatcher改为PathPatternParser),导致了与springfox-swagger的兼容性问题。但是,我们当前的问题发生在Spring Boot 2.0.6.RELEASE,这是一个较旧的版本,因此问题可能有所不同。 分析: 1. `NoClassDefFoundError: org/springframework/web/servlet/HandlerMapping` 表示缺少`HandlerMapping`类。 2. `HandlerMapping`是Spring Web MVC中的一个核心类,通常包含在`spring-webmvc`依赖中。 3.Spring Boot 2.0.6中,默认的Spring框架版本是5.0.10.RELEASE,这个版本是包含`HandlerMapping`的。 因此,问题可能的原因是: - 项目依赖中没有包含`spring-webmvc`,但Spring Boot starter web已经包含了它,所以如果项目引入了`spring-boot-starter-web`,则不应该缺失。 - 更可能的是,依赖冲突导致正确的类没有被加载。比如,项目中可能有多个版本的`spring-webmvc`,而错误的版本被加载(可能是不包含该类的版本)。 然而,根据错误信息,我们注意到缺失的类是在`springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration`的类加载过程中发生的。这可能是由于springfox-swagger的版本与Spring Boot 2.0.6不兼容。 回顾springfox-swagger的版本: - Swagger 2.9.2 是一个比较稳定的版本,支持Spring Boot 2.0.x。 因此,解决方案可能包括: 1. 确保引入了正确的springfox-swagger依赖,并且版本与Spring Boot 2.0.6兼容。 2. 检查依赖冲突,确保没有多个版本的Spring Web MVC。 步骤: #### 第一步:确认依赖 在Spring Boot 2.0.6项目中,建议使用springfox-swagger2的2.9.2版本。 依赖配置示例(Maven): ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> ``` 或者,如果你使用的是Gradle: ```groovy implementation &#39;io.springfox:springfox-swagger2:2.9.2&#39; implementation &#39;io.springfox:springfox-swagger-ui:2.9.2&#39; ``` #### 第二步:检查依赖冲突 使用Maven或Gradle的依赖树命令检查是否有版本冲突。 Maven: ``` mvn dependency:tree ``` Gradle: ``` gradle dependencies ``` 检查是否有不同版本的`spring-webmvc`被引入,确保版本为5.0.10.RELEASE(与Spring Boot 2.0.6匹配)。 #### 第三步:排除冲突的依赖 如果发现有其他依赖引入了旧版本的`spring-webmvc`,可以通过排除传递依赖来解决。 例如,在Maven中排除: ```xml <dependency> <groupId>some.group</groupId> <artifactId>some-artifact</artifactId> <version>X.X.X</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </exclusion> </exclusions> </dependency> ``` #### 第四步:清理重新构建 在修改依赖后,执行清理重新构建项目。 如果是Maven项目: ``` mvn clean install ``` 如果是Gradle项目: ``` gradle clean build ``` #### 第五步:配置SwaggerSpring Boot 2.0.6中,Swagger配置类通常不需要特殊处理。但可以参考以下基本配置: ```java @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } } ``` 但是,如果上述步骤仍然不能解决问题,可能需要考虑以下情况: - 项目结构问题:确保配置类位于主应用类(有`@SpringBootApplication`注解的类)的子包或同级包中,以便被组件扫描到。 - 如果项目中使用了Spring Boot的自动配置,但某些条件不满足,可以尝试排除Swagger的自动配置(一般不必要)。 #### 关于引用中提到的Spring Boot 2.6.x的解决方案 由于我们使用的是2.0.6,因此引用[2][3]中提到的`spring.mvc.pathmatch.matching-strategy=ant_path_matcher`配置并不适用。因为2.0.6版本默认就是使用`AntPathMatcher`,且没有引入`PathPatternParser`。 但是,如果项目中也同时引入了较高版本的springfox(比如3.0.0),则会出现不兼容。因此,确保使用的是2.9.2版本非常重要。 #### 总结 针对Spring Boot 2.0.6.RELEASE出现的问题,主要步骤是: 1. 使用兼容的springfox-swagger版本(2.9.2)。 2. 检查并解决依赖冲突,特别是`spring-webmvc`的版本。 如果按照以上步骤操作,应该能解决该问题。 如果问题仍然存在,请提供更详细的依赖树信息以便进一步分析。 §§相关问题§§ 1. Spring Boot 2.0.x项目中如何正确整合springfox-swagger? 2. 如何排查解决Java中的NoClassDefFoundErrorClassNotFoundException? 3. 在Maven或Gradle中如何排除传递依赖? 4. Spring Boot不同版本中整合springfox-swagger有哪些常见问题? </think>### 问题分析及解决方案 您在 Spring Boot 2.0.6.RELEASE 项目中遇到的 `java.lang.IllegalStateException` `NoClassDefFoundError` 问题,主要由 **springfox-swagger 版本兼容性** **依赖缺失** 导致。以下是具体原因解决方案: --- ### 原因解析 1. **版本不兼容** Spring Boot 2.0.x 需使用 **springfox-swagger 2.x** 版本(推荐 2.9.2)。Swagger 3.0+ 需要 Spring Boot 2.2+ 支持,但您使用的是 2.0.6(旧版),导致类加载失败。 2. **缺少关键依赖** `ClassNotFoundException: org.springframework.web.servlet.HandlerMapping` 表明项目缺失 Spring Web MVC 核心依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> ``` 3. **依赖冲突** 项目中可能存在多个冲突的 Spring 版本(如通过其他依赖引入的旧版 `spring-webmvc`)。 --- ### 解决方案 #### 步骤 1:修正 Swagger 依赖版本 **移除 Swagger 3.0+ 依赖**,改用兼容的 2.9.2 版本: ```xml <!-- 删除原有依赖 --> <!-- <dependency> springfox-boot-starter </dependency> --> <!-- 添加正确版本 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> ``` #### 步骤 2:补充 Spring Web MVC 依赖 在 `pom.xml` 中确保包含: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.0.6.RELEASE</version> <!--Spring Boot主版本一致 --> </dependency> ``` #### 步骤 3:检查依赖冲突 执行以下命令检查依赖树: ```bash mvn dependency:tree | grep -E "spring-webmvc|spring-core" ``` 若存在冲突版本,手动排除: ```xml <dependency> <groupId>problematic-group</groupId> <artifactId>problematic-artifact</artifactId> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </exclusion> </exclusions> </dependency> ``` #### 步骤 4:验证 Swagger 配置类 确保配置类与 Spring Boot 2.0.x 兼容: ```java @Configuration @EnableSwagger2 // 注意是 @EnableSwagger2 而非 @EnableSwagger2WebMvc public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.your.package")) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("API文档") .version("1.0") .build(); } } ``` #### 步骤 5:清理并重启项目 ```bash mvn clean install && mvn spring-boot:run ``` --- ### 关键注意事项 1. **Spring Boot 2.0.x 不支持 Swagger 3.0+**: 坚持使用 2.9.2 版本,避免兼容性问题[^1][^4]。 2. **验证依赖完整性**: 确认 `spring-boot-starter-web` 已正确引入 `spring-webmvc` 5.0.10.RELEASESpring Boot 2.0.6 默认版本)。 3. **避免配置覆写**: 勿添加 `WebMvcConfigurationSupport` 的子类,这会禁用 Spring Boot 自动配置[^2]。 --- ### 相关问题 1. 如何检查 Maven 项目的依赖冲突? 2. Spring Boot 2.0.x 项目中如何整合其他常用组件(如 Spring Data JPA)? 3. Swagger 2.9.2 与 OpenAPI 3.0 的主要区别是什么? 4. 如何在旧版 Spring Boot 中实现 API 文档管理(除 Swagger 外)? [^1]: Springfox Boot Starter 兼容性问题分析 [^2]: WebMvcConfigurationSupport 的副作用说明 [^3]: 路径匹配策略对 Swagger 的影响机制 [^4]: Swagger 版本与 Spring Boot 的对应关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值