无法修改代码时,如何在Swagger中关联Integer类型code与TYPE枚举?
在不修改代码的情况下关联Swagger字段与枚举值
可以实现,无需修改现有代码,通过自定义Swagger的扩展逻辑,就能把DetailResponse的code字段和ProgramException.TYPE枚举关联,在文档中展示可选值列表。下面针对两种主流Swagger实现给出具体方案:
方案一:基于SpringFox(Swagger 2.x)
通过自定义ModelPropertyBuilderPlugin插件,动态为目标字段添加枚举值约束:
- 新增插件类:
import org.springframework.stereotype.Component; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin; import springfox.documentation.spi.schema.contexts.ModelPropertyContext; import springfox.documentation.swagger.common.SwaggerPluginSupport; import java.util.Arrays; import java.util.stream.Collectors; @Component public class DetailResponseCodeEnumPlugin implements ModelPropertyBuilderPlugin { @Override public void apply(ModelPropertyContext context) { // 匹配DetailResponse类的code字段 if ("code".equals(context.getBeanPropertyDefinition().get().getName()) && DetailResponse.class.equals(context.getBeanPropertyDefinition().get().getDeclaringClass())) { // 获取TYPE枚举的所有code值 String allowableValues = Arrays.stream(ProgramException.TYPE.values()) .map(type -> String.valueOf(type.getCode())) // 假设枚举有getCode()方法返回对应数值 .collect(Collectors.joining(",")); // 设置Swagger字段的可选值 context.getBuilder().allowableValues(allowableValues); } } @Override public boolean supports(DocumentationType documentationType) { return SwaggerPluginSupport.pluginDoesApply(documentationType); } }
- 确保Spring能扫描到这个组件类,Swagger启动时会自动加载插件,将枚举值关联到
code字段。
方案二:基于SpringDoc OpenAPI(Swagger 3.x)
通过自定义SchemaCustomizer来修改字段的Schema定义,添加枚举约束:
- 新增自定义类:
import org.springdoc.core.customizers.SchemaCustomizer; import org.springframework.stereotype.Component; import io.swagger.v3.oas.models.media.Schema; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Component public class DetailResponseCodeSchemaCustomizer implements SchemaCustomizer { @Override public void customize(Schema<?> schema, Class<?> type) { // 匹配DetailResponse类 if (DetailResponse.class.equals(type)) { // 获取TYPE枚举的所有code值 List<Integer> enumValues = Arrays.stream(ProgramException.TYPE.values()) .map(ProgramException.TYPE::getCode) // 假设枚举有getCode()方法返回对应数值 .collect(Collectors.toList()); // 为code字段设置枚举值 schema.getProperties().get("code").setEnum(enumValues); } } }
- SpringDoc会自动识别并应用这个自定义器,生成的Swagger文档中
code字段会展示所有枚举对应的可选数值。
注意事项
- 假设
ProgramException.TYPE枚举类包含构造方法和getCode()getter方法来返回枚举对应的数值(比如private final int code; public TYPE(int code) {this.code = code;} public int getCode() {return code;}),如果原有枚举没有该方法,可通过反射获取枚举的私有字段值替代(比如用Field类获取code字段的值)。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

