You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.7下Spring与Jersey API的Swagger统一配置优化问询

问题描述

我在Spring Boot 2.7版本的应用中,为Spring实现的私有API配置了Swagger,同时服务器上还有Jersey实现的公共API,也已配置Swagger并可正常访问。访问http://localhost:8080/@context.root@/swagger-ui/index.html能看到两个文档定义:

  • "01 - public" -> /@context.root@/swagger-ui/pub/openapi.json
  • "02 - private" -> /@context.root@/v3/api-docs/02 - private

但当前配置存在冗余,两者的openapi.json生成逻辑不同,我希望统一用GroupedOpenApi类配置Jersey公共API的Swagger,同时移除application.yml中的urls配置,但尝试后生成的公共API文档没有端点/操作,未能成功实现。计划下月升级至Spring Boot 3。

解决方案

要实现统一用GroupedOpenApi管理Jersey公共API的Swagger,需要借助springdoc对Jersey的集成支持,具体步骤如下:

1. 添加springdoc-Jersey集成依赖

springdoc默认只支持Spring MVC控制器,要扫描Jersey资源类,需添加专门的集成依赖。修改pom.xml,新增以下依赖:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-jersey-core</artifactId>
    <version>1.6.2</version> <!-- 版本要和springdoc-openapi-ui保持一致 -->
</dependency>

2. 启用并配置公共API的GroupedOpenApi Bean

在SwaggerConfiguration中取消注释publicApi Bean,并调整配置确保能识别Jersey资源:

@Bean
public GroupedOpenApi publicApi(final AppProperties properties) {
    return GroupedOpenApi.builder()
        .group("01 - public")
        .pathsToMatch("/api/pub/**")
        .packagesToScan("path.to.resources.package.api.pub") // 指定Jersey资源所在包
        .addOpenApiCustomiser(customizeApiPublic(properties))
        .build();
}

private OpenApiCustomiser customizeApiPublic(final AppProperties properties) {
    return (final OpenAPI openApi) -> openApi
        .addServersItem(new Server().url("/" + properties.getContextRoot() + "/api/pub"))
        .getInfo()
        .title("Public API title")
        .description("Public API description")
        .version(properties.getAppVersion());
}

3. 移除Jersey中原有Swagger配置

修改ApiPublicJerseyConfig,删除原有的Swagger注册代码,只保留Jersey资源包扫描:

public class ApiPublicJerseyConfig extends ResourceConfig {
    public ApiPublicJerseyConfig(AppProperties properties) {
        super();
        packages("path.to.resources.package.api.pub");
        // 移除原有的register(swaggerConfig(properties))相关代码
    }
}

4. 调整Jersey Servlet映射

修改AppConfiguration中的publicJersey Bean,去掉Swagger相关的URL映射,由springdoc统一处理:

@Bean
public ServletRegistrationBean<ServletContainer> publicJersey(AppProperties properties) 
{
    ServletRegistrationBean<ServletContainer> pubJersey = new ServletRegistrationBean<>(
         new ServletContainer(new ApiPublicJerseyConfig(properties)));
    pubJersey.addUrlMappings("/api/pub/*"); // 移除/swagger-ui/pub/*映射
    pubJersey.setLoadOnStartup(0);
    return pubJersey;
}

5. 清理application.yml配置

移除springdoc.swagger-ui.urls配置项,修改后的application.yml如下:

springdoc:
  swagger-ui:
    disable-swagger-default-url: true
    defaultModelExpandDepth: 3
    operationsSorter: "alpha"
    tagsSorter: "alpha"

原理说明

添加的springdoc-openapi-jersey-core依赖会自动注册Jersey资源扫描器,让springdoc能够识别Jersey的@Path、@GET等注解,生成符合OpenAPI规范的文档。此时两个API的文档都会通过springdoc的/v3/api-docs/{group-name}路径暴露,swagger-ui会自动加载所有GroupedOpenApi定义的分组。

内容的提问来源于stack exchange,提问作者TCH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:17:08