Spring Boot中如何在Swagger文档中隐藏Student类的id参数?
解决方案:隐藏Swagger文档中的Student类id字段
针对你遇到的@Schema(hidden = true)和@Parameter(hidden = true)注解无效的问题,可根据你使用的Swagger版本和场景,尝试以下几种方案:
1. 确认注解与Swagger版本匹配
Swagger 2(Springfox)和OpenAPI 3(Springdoc)使用的注解不同,别混用:
- 如果用Springdoc OpenAPI(主流新版本):使用
io.swagger.v3.oas.annotations.media.Schema注解,直接标注在id字段上:
import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; public class Student { @Schema(hidden = true) private Long id; private String name; private String email; private LocalDate dob; private Integer age; // Getter、Setter方法 }
- 如果用Springfox Swagger 2:使用
springfox.documentation.annotations.ApiModelProperty注解:
import springfox.documentation.annotations.ApiModelProperty; import java.time.LocalDate; public class Student { @ApiModelProperty(hidden = true) private Long id; private String name; private String email; private LocalDate dob; private Integer age; // Getter、Setter方法 }
2. 尝试将注解标注在Getter方法上
部分场景下,Swagger会通过Getter方法识别字段,若字段上的注解无效,可将注解移到id的Getter方法上:
@Schema(hidden = true) // 或@ApiModelProperty(hidden = true) public Long getId() { return id; }
3. 自定义模型过滤规则(全局生效)
如果以上方法都无效,可通过自定义配置过滤掉Student类的id字段:
Springdoc OpenAPI配置
import org.springdoc.core.customizers.ModelBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Map; import java.util.stream.Collectors; @Configuration public class OpenApiConfig { @Bean public ModelBuilderCustomizer modelBuilderCustomizer() { return (modelBuilder, modelContext) -> { if (Student.class.equals(modelContext.getType())) { // 过滤掉id属性 Map<String, Object> filteredProps = modelBuilder.getProperties().entrySet().stream() .filter(entry -> !"id".equals(entry.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); modelBuilder.properties(filteredProps); } }; } }
Springfox Swagger 2配置
import com.fasterxml.classmate.TypeResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ModelBuilder; import springfox.documentation.schema.ModelProperty; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.schema.ModelBuilderPlugin; import springfox.documentation.spi.schema.contexts.ModelContext; import java.util.Map; import java.util.stream.Collectors; @Configuration public class SwaggerConfig { @Bean public ModelBuilderPlugin hideIdFieldPlugin(TypeResolver typeResolver) { return new ModelBuilderPlugin() { @Override public void apply(ModelContext context) { if (Student.class.equals(context.getType().getErasedType())) { ModelBuilder builder = context.getBuilder(); Map<String, ModelProperty> filteredProps = builder.build().getProperties().entrySet().stream() .filter(entry -> !"id".equals(entry.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); builder.properties(filteredProps); } } @Override public boolean supports(DocumentationType delimiter) { return true; } }; } }
完成以上配置后,重启服务,Swagger文档中就只会展示你期望的name、email、dob、age四个字段了。
内容的提问来源于stack exchange,提问作者Serdar
相关产品推荐
相关产品推荐

