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

Spring Boot Swagger:如何根据Spring Profile忽略指定API?

解决方案:基于Spring Boot环境变量控制私有API的Swagger展示

当然可以实现!而且有几种不同的方案,适配不同的场景需求,我给你一一拆解:

方案一:用SpEL直接控制@ApiOperation的hidden属性(最简洁)

Spring Fox的@ApiOperation注解提供了hidden属性,支持通过SpEL表达式动态判断是否隐藏API。你可以直接利用Spring Boot的环境变量来控制:

@RestController
public class MyController {

    // 私有API:仅在生产环境隐藏,QA/Dev环境可见
    @GetMapping("/private-api")
    @ApiOperation(
        value = "私有接口示例",
        hidden = "${spring.profiles.active == 'prod'}"
    )
    public ResponseEntity<String> privateApi() {
        return ResponseEntity.ok("私有内容");
    }

    // 公开API:所有环境可见
    @GetMapping("/public-api")
    public ResponseEntity<String> publicApi() {
        return ResponseEntity.ok("公开内容");
    }
}

只要你的Spring Boot环境变量spring.profiles.active设置为prod,这个接口就会在Swagger文档中隐藏;其他环境(比如dev、qa)下则正常展示。

方案二:通过Docket配置批量过滤私有API(适合大量私有接口)

如果你的私有API数量较多,逐个加注解太麻烦,可以自定义一个标记注解,然后在Swagger的Docket配置中根据环境批量过滤:

步骤1:定义私有API标记注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrivateApi {
}

步骤2:在控制器中标记私有API

@RestController
public class MyController {

    @PrivateApi
    @GetMapping("/private-api-1")
    public ResponseEntity<String> privateApi1() {
        return ResponseEntity.ok("私有内容1");
    }

    @PrivateApi
    @GetMapping("/private-api-2")
    public ResponseEntity<String> privateApi2() {
        return ResponseEntity.ok("私有内容2");
    }
}

步骤3:配置Docket根据环境过滤

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Autowired
    private Environment environment;

    @Bean
    public Docket api() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.your.package.controller"));

        // 判断当前是否为生产环境,是的话排除所有带@PrivateApi的接口
        boolean isProdEnv = Arrays.asList(environment.getActiveProfiles()).contains("prod");
        if (isProdEnv) {
            docket = docket.apis(not(RequestHandlerSelectors.withMethodAnnotation(PrivateApi.class)));
        }

        return docket.paths(PathSelectors.any())
                .build();
    }
}

这种方式的好处是可以统一管理私有API的过滤规则,后续新增私有接口只需要加@PrivateApi注解即可,无需修改配置。

方案三:自定义条件化的@ApiIgnore注解(适配原有@ApiIgnore习惯)

如果你习惯用@ApiIgnore,可以自定义一个仅在生产环境生效的注解,结合Spring的条件注解来控制:

步骤1:自定义条件化注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ApiIgnore
@Conditional(ProdEnvironmentCondition.class)
public @interface ProdOnlyApiIgnore {
}

步骤2:编写环境判断条件类

public class ProdEnvironmentCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 判断当前激活的环境是否为生产
        return Arrays.asList(context.getEnvironment().getActiveProfiles()).contains("prod");
    }
}

步骤3:在控制器中使用

@RestController
public class MyController {

    @ProdOnlyApiIgnore
    @GetMapping("/private-api")
    public ResponseEntity<String> privateApi() {
        return ResponseEntity.ok("私有内容");
    }
}

这个注解只有在生产环境下才会被Spring识别为@ApiIgnore,从而隐藏接口;非生产环境下,该注解不生效,接口正常展示。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:05:06