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

为何Spring Boot中Swagger自动生成Employer完整CRUD接口?如何禁用?

问题描述

我创建了一个Spring Boot项目,定义了如下仅包含GET /employers端点的EmployerController:

@RestController
public class EmployerController {

    @Autowired
    private EmployerService employerService;

    @GetMapping(path = "/employers")
    public List<Employer> getEmployers() {
        return (List<Employer>) employerService.getEmployers();
    }
}

同时实现了关联的EmployerService、EmployerRepository及Employer实体。添加Swagger/OpenAPI到类路径后,访问http://localhost:8080/swagger-ui.html时,发现Swagger UI中显示了Employer实体的完整CRUD(GET/POST/PUT/DELETE/PATCH)REST接口定义,但我仅编写了单个GET接口。请问该现象的原因是什么?是否可配置禁用这类自动生成的REST接口?

原因分析

出现该现象的核心原因是Spring Data REST的自动配置机制:

  • 当项目中存在继承Repository(或其子接口如JpaRepository)的EmployerRepository时,Spring Data REST会默认自动将该Repository暴露为一套完整的REST CRUD接口,默认路径为实体类名的复数形式(即/employers)。
  • Swagger/OpenAPI的扫描逻辑会自动发现这些由Spring Data REST动态生成的接口,并将其展示在Swagger UI中,导致自定义的GET /employers接口与自动生成的CRUD接口共存。
解决方案

针对该问题,有两种常见处理方式,可根据实际需求选择:

方式一:完全禁用Spring Data REST的自动接口生成

如果不需要Spring Data REST提供的自动CRUD接口,可直接关闭其自动配置:

  1. 通过配置文件关闭:
    在application.properties中添加:
    spring.data.rest.enabled=false
    
    或在application.yml中添加:
    spring:
      data:
        rest:
          enabled: false
    
  2. 通过启动类排除自动配置类:
    @SpringBootApplication(exclude = {RepositoryRestMvcAutoConfiguration.class})
    public class YourApplication {
        public static void main(String[] args) {
            SpringApplication.run(YourApplication.class, args);
        }
    }
    

方式二:让Swagger忽略Spring Data REST生成的接口

如果需要保留Spring Data REST的接口但不想在Swagger中展示,可通过配置Swagger的扫描规则实现:

针对SpringDoc OpenAPI(Swagger 3)

  • 仅扫描自定义Controller所在的包:
    @Configuration
    @OpenAPIDefinition(info = @Info(title = "自定义API文档", version = "1.0"))
    @ComponentScan(basePackages = "com.yourproject.controller") // 替换为你的自定义Controller包路径
    public class OpenApiConfig {
    }
    

针对Springfox Swagger 2

  • 通过Docket指定扫描范围:
    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
        @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.yourproject.controller")) // 替换为你的自定义Controller包路径
                    .paths(PathSelectors.any())
                    .build();
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:57:36