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

无法修改代码时,如何在Swagger中关联Integer类型code与TYPE枚举?

在不修改代码的情况下关联Swagger字段与枚举值

可以实现,无需修改现有代码,通过自定义Swagger的扩展逻辑,就能把DetailResponse的code字段和ProgramException.TYPE枚举关联,在文档中展示可选值列表。下面针对两种主流Swagger实现给出具体方案:


方案一:基于SpringFox(Swagger 2.x)

通过自定义ModelPropertyBuilderPlugin插件,动态为目标字段添加枚举值约束:

  1. 新增插件类:
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);
    }
}
  1. 确保Spring能扫描到这个组件类,Swagger启动时会自动加载插件,将枚举值关联到code字段。

方案二:基于SpringDoc OpenAPI(Swagger 3.x)

通过自定义SchemaCustomizer来修改字段的Schema定义,添加枚举约束:

  1. 新增自定义类:
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);
        }
    }
}
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:57:25