Swagger-SpringMVC 项目从 V1 迁移到 V2 的完整指南

Swagger-SpringMVC 项目从 V1 迁移到 V2 的完整指南

springfox springfox 项目地址: https://gitcode.com/gh_mirrors/spr/springfox

模块架构的重大变化

在 Swagger-SpringMVC 项目从 V1 升级到 V2 的过程中,最显著的变化是整个架构被重新设计为更加模块化的结构。原先的两个主要模块 swagger-springmvcswagger-models 现在被拆分成多个职责更加明确的模块。

新架构设计理念

项目团队在设计 V2 版本时,意识到需要重构服务模型和模式推断的逻辑。因此采用了两步走的策略:

  1. 服务模型推断:首先将服务模型推断为内部表示形式
  2. 映射层:然后创建映射层,将内部模型映射到不同的规范格式

这种设计带来了以下优势:

  • 原生支持 Swagger 1.2 和 2.0 规范
  • 未来可扩展支持其他格式如 RAML、ALPS 和超媒体格式
  • 各模块职责更加清晰,便于维护和扩展

新模块结构详解

以下是新版本的核心模块及其功能:

springfox-core
└── 包含内部服务和模式描述模型及其构建器

springfox-spi
└── 包含服务提供者接口,可用于扩展和丰富服务模型
    └── 例如Swagger特定注解处理器

springfox-schema
└── 帮助构建参数、模型和响应的模式推断扩展

springfox-spring-web
└── 基于Spring Web的扩展,根据RequestMapping信息构建服务模型
    └── 这是推断服务模型的核心库

springfox-swagger-common
└── 通用的Swagger特定扩展,能识别不同的Swagger注解

springfox-swagger1
└── 配置和映射层,知道如何将服务模型转换为Swagger 1.2规范文档

springfox-swagger2
└── 配置和映射层,知道如何将服务模型转换为Swagger 2.0规范文档

配置变更详解

包名变更

所有包名从 com.mangofactory.swagger 变更为 springfox.documentation,这一变化反映了项目的发展和标准化进程。

启用Swagger支持

根据需要的Swagger规范版本,使用不同的注解:

// 启用Swagger 1.2支持
@EnableSwagger

// 启用Swagger 2.0支持
@EnableSwagger2

核心配置类变更

不再使用 SwaggerSpringMvcPlugin 来配置文档子集,而是引入了更通用的 Docket 类。这一变化使得文档内容的表达与文档呈现格式解耦。

主要变化点:
  1. 不再需要 SpringSwaggerConfig 类来配置 Docket
  2. 移除了原有的自动装配代码:
    @Autowired
    private SpringSwaggerConfig swaggerConfig;
    

Docket 类详解

Docket 名称来源于法律术语,意为"文档内容摘要"。它与 SwaggerSpringMvcPlugin 类似,但提供了更强大的API选择能力。

典型配置示例:
@Bean
public Docket swaggerSpringMvcPlugin() {
    return new Docket(DocumentationType.SWAGGER_2)
            .groupName("business-api")
            .select() 
               // 忽略带有@CustomIgnore注解的控制器
              .apis(not(withClassAnnotation(CustomIgnore.class)) // 通过RequestHandler选择
              .paths(paths()) // 通过路径选择
              .build()
            .apiInfo(apiInfo())
            .securitySchemes(securitySchemes())
            .securityContext(securityContext());
}

// 路径选择谓词示例
private Predicate<String> paths() {
    return or(
        regex("/business.*"),
        regex("/some.*"),
        regex("/contacts.*"),
        regex("/pet.*"));
}
实用谓词工具:
  • RequestHandlerSelectors:提供多种基于请求处理器的选择方式
  • PathSelectors:提供多种基于路径的选择方式

高级配置技巧

配置ObjectMapper

推荐通过监听 ObjectMapperConfigured 事件来配置ObjectMapper。无论应用中是否存在自定义的ObjectMapper,库始终会配置一个专用于序列化Swagger 1.2和2.0类型的ObjectMapper。

实现方式:

@Component
public class ObjectMapperConfigurer implements ApplicationListener<ObjectMapperConfigured> {
    @Override
    public void onApplicationEvent(ObjectMapperConfigured event) {
        ObjectMapper objectMapper = event.getObjectMapper();
        // 在这里添加自定义配置
        objectMapper.setSerializationInclusion(Include.NON_NULL);
    }
}

注意:如果在应用启动时遇到NullPointerException,可能是因为缺少 @EnableWebMvc 注解。

自定义Swagger端点

默认的Swagger文档生成URL:

| Swagger版本 | 默认URL | |------------|-------------| | 1.2 | /api-docs | | 2.0 | /v2/api-docs |

可以通过属性文件覆盖这些端点:

| Swagger版本 | 覆盖属性 | |------------|-----------------------------------| | 1.2 | springfox.documentation.swagger.v1.path | | 2.0 | springfox.documentation.swagger.v2.path |

覆盖属性数据类型

使用 @ApiModelProperty#dataType 可以覆盖推断的数据类型,但需要注意:

  1. 必须使用完全限定类名
  2. 如果指定的类无法通过 Class.forName() 加载,原始类型将被保留

示例:

// 成功替换的情况
@ApiModelProperty(dataType = "com.example.ReplacedWith")
public Original getOriginal() { ... }

// 替换失败的情况(保留Original类型)
@ApiModelProperty(dataType = "InvalidType")
public Original getAnotherOriginal() { ... }

扩展性说明

Swagger-SpringMVC V2 提供了多种扩展钩子来丰富/增强模式和模型:

  1. 模型和属性增强:可以通过扩展点自定义模型和属性的表示方式
  2. 服务模型增强:可以扩展和修改服务模型的生成逻辑

(注:原文中TODO部分表示这些扩展点的具体实现方式将在后续版本中完善)

迁移建议

对于从V1迁移到V2的项目,建议:

  1. 首先更新包导入语句
  2. 替换原有的SwaggerSpringMvcPlugin为新的Docket配置
  3. 检查并更新自定义的ObjectMapper配置方式
  4. 根据需要调整API端点和路径配置
  5. 测试所有自定义扩展点是否与新版本兼容

通过遵循这些步骤,可以平稳地从V1迁移到功能更强大、设计更合理的V2版本。

springfox springfox 项目地址: https://gitcode.com/gh_mirrors/spr/springfox

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郁英忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值