1. 为什么需要从EnableSwagger2迁移到EnableSwagger2WebMvc最近在升级Spring Boot项目中的Swagger版本时遇到了一个典型问题项目启动后访问Swagger UI页面时出现Unable to infer base url错误。经过排查发现这个问题源于Swagger2.10.x版本对核心注解的重大变更。下面我就来详细解释这个变更背后的原因以及如何正确迁移。在Swagger2.9.x及更早版本中我们习惯使用EnableSwagger2注解来启用Swagger支持。这个注解就像是一个总开关告诉Spring Boot我要使用Swagger功能了。但在2.10.x版本中开发团队做了架构调整将这个通用注解拆分成了两个更具体的注解EnableSwagger2WebMvc和EnableSwagger2WebFlux。这种变化其实反映了Spring生态的发展趋势。随着Spring WebFlux响应式编程的普及原先单一的EnableSwagger2注解已经无法很好地同时支持传统的Servlet-based WebMvc和响应式WebFlux两种编程模型。就像我们家里用电以前可能只需要一个总闸但随着电器增多现在需要分照明电路和插座电路一样这种拆分让Swagger能更好地适应不同的编程范式。2. 完整依赖配置方案要让Swagger2.10.x在Spring Boot项目中正常工作依赖配置是关键。很多开发者只添加了springfox-swagger2和springfox-swagger-ui这两个基础依赖这就会导致前面提到的Unable to infer base url错误。正确的做法是还需要添加springfox-spring-webmvc这个关键依赖。下面是一个完整的依赖配置示例!-- Swagger核心依赖 -- dependency groupIdio.springfox/groupId artifactIdspringfox-swagger2/artifactId version2.10.5/version /dependency !-- Swagger UI界面依赖 -- dependency groupIdio.springfox/groupId artifactIdspringfox-swagger-ui/artifactId version2.10.5/version /dependency !-- 关键新增的WebMvc支持依赖 -- dependency groupIdio.springfox/groupId artifactIdspringfox-spring-webmvc/artifactId version2.10.5/version /dependency这个springfox-spring-webmvc依赖就像是Swagger和Spring WebMvc之间的桥梁。没有它Swagger就无法正确识别你的Controller路由信息自然也就无法生成正确的API文档。我曾在项目中漏加这个依赖结果调试了半天才发现问题所在。3. 配置类改造实战现在我们来具体看看如何改造原有的Swagger配置类。假设你原来的配置类是这样的EnableSwagger2 Configuration public class SwaggerConfig { // 原有配置内容 }在2.10.x版本中你需要做两处修改将EnableSwagger2替换为EnableSwagger2WebMvc确保添加了前面提到的springfox-spring-webmvc依赖改造后的配置类如下EnableSwagger2WebMvc Configuration 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文档) .description(项目接口文档) .version(1.0) .build(); } }这里有个实际项目中的经验分享如果你的Controller分布在多个包下可以使用多个RequestHandlerSelectors来组合选择就像这样.apis(RequestHandlerSelectors.basePackage(com.package1) .or(RequestHandlerSelectors.basePackage(com.package2)))4. 常见问题排查指南在实际迁移过程中你可能会遇到各种问题。下面我整理了几个最常见的问题及其解决方案问题一启动后访问/swagger-ui.html报404这通常是因为Spring Boot的静态资源处理问题。可以尝试以下解决方案检查是否添加了springfox-swagger-ui依赖确保没有自定义的WebMvc配置拦截了/swagger-ui.html路径尝试访问/swagger-ui/index.html某些版本可能需要这样访问问题二文档页面能打开但显示No operations defined in spec!这个问题说明Swagger没有扫描到你的Controller。检查以下几点确认EnableSwagger2WebMvc注解已添加检查RequestHandlerSelectors.basePackage配置的包路径是否正确确保Controller类上有RestController或Controller注解问题三参数类型不匹配在2.10.x版本中我遇到过前端传递字符串但后端接收数字的问题。这时需要在配置类中添加以下代码Docket docket new Docket(DocumentationType.SWAGGER_2) .directModelSubstitute(Long.class, String.class) // 将Long转为String .select() // 其他配置...问题四日期类型显示不正确如果需要统一日期格式可以这样配置Docket docket new Docket(DocumentationType.SWAGGER_2) .directModelSubstitute(LocalDate.class, String.class) .directModelSubstitute(LocalDateTime.class, String.class) .select() // 其他配置...5. 版本选择建议虽然本文重点介绍2.10.x版本的配置但实际项目中版本选择需要谨慎。根据我的经验如果你需要稳定性建议使用2.9.2版本这是经过广泛验证的稳定版本如果你想尝试新特性可以考虑直接升级到3.0.0版本但要注意3.x版本的配置方式有很大变化2.10.x版本可以看作是一个过渡版本主要用于测试新架构下表对比了各主要版本的特点版本号稳定性注解方式WebFlux支持备注2.9.2高EnableSwagger2否最稳定版本2.10.5中EnableSwagger2WebMvc是过渡版本3.0.0中高EnableOpenApi是最新架构6. 高级配置技巧掌握了基础迁移后下面分享几个实际项目中很有用的高级配置技巧分组配置大型项目中我们通常需要按模块分组显示API。可以这样配置多个DocketBean public Docket userApi() { return new Docket(DocumentationType.SWAGGER_2) .groupName(用户模块) .select() .apis(RequestHandlerSelectors.basePackage(com.your.user)) .build(); } Bean public Docket orderApi() { return new Docket(DocumentationType.SWAGGER_2) .groupName(订单模块) .select() .apis(RequestHandlerSelectors.basePackage(com.your.order)) .build(); }安全头信息如果API需要认证可以这样配置全局参数Docket docket new Docket(DocumentationType.SWAGGER_2) .securitySchemes(Arrays.asList( new ApiKey(Authorization, Authorization, header))) .select() // 其他配置...自定义响应消息统一规范返回码Docket docket new Docket(DocumentationType.SWAGGER_2) .useDefaultResponseMessages(false) .globalResponseMessage(RequestMethod.GET, Arrays.asList( new ResponseMessageBuilder().code(200).message(成功).build(), new ResponseMessageBuilder().code(400).message(请求错误).build() )) .select() // 其他配置...7. 生产环境最佳实践在实际生产环境中使用Swagger还需要注意以下几点访问控制一定要限制Swagger UI的访问权限可以通过Spring Security配置Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(/swagger-ui.html).hasRole(ADMIN) // 其他配置... }性能考虑Swagger会扫描所有Controller项目越大启动越慢。可以考虑只在开发环境启用Profile(dev) EnableSwagger2WebMvc Configuration public class SwaggerConfig { // 配置内容 }文档补充善用Api、ApiOperation等注解增强文档可读性Api(tags 用户管理) RestController RequestMapping(/users) public class UserController { ApiOperation(创建用户) PostMapping public User createUser(RequestBody User user) { // 实现代码 } }版本管理建议在Swagger UI标题中显示项目版本便于区分private ApiInfo apiInfo() { return new ApiInfoBuilder() .title(项目API文档 [ appVersion ]) // 其他配置... }