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

OpenApi 3.0.1中如何配置枚举展示自定义属性而非默认枚举名

实现方案

以下针对你使用的不同Swagger版本提供对应实现方案:

方案1:Springdoc OpenAPI 3.x(SpringBoot 2.x/3.x主流版本)

通过自定义全局枚举转换器,自动适配ErrorCode枚举的展示逻辑:

  1. 首先创建自定义Model转换器
import io.swagger.v3.core.converter.AnnotatedType;
import io.swagger.v3.core.converter.ModelConverter;
import io.swagger.v3.core.converter.ModelConverterContext;
import io.swagger.v3.oas.models.media.IntegerSchema;
import io.swagger.v3.oas.models.media.Schema;
import java.util.Arrays;
import java.util.Iterator;
import java.util.stream.Collectors;

public class ErrorCodeEnumConverter implements ModelConverter {
    @Override
    public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
        // 仅处理ErrorCode类型的字段
        if (type.getType().getTypeName().equals(ErrorCode.class.getName())) {
            IntegerSchema schema = new IntegerSchema();
            // 自动提取所有枚举项的errorId作为允许值
            schema.setAllowableValues(Arrays.stream(ErrorCode.values())
                    .map(ErrorCode::getErrorId)
                    .collect(Collectors.toList()));
            // 可选:补充每个错误码对应的说明
            String desc = Arrays.stream(ErrorCode.values())
                    .map(e -> e.getErrorId() + ": " + e.getErrorMsg())
                    .collect(Collectors.joining("<br/>"));
            schema.setDescription("错误码列表:<br/>" + desc);
            return schema;
        }
        return chain.next().resolve(type, context, chain);
    }
}
  1. 注册转换器到Swagger配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {
    @Bean
    public ModelConverter errorCodeEnumConverter() {
        return new ErrorCodeEnumConverter();
    }
}

配置完成后所有标注@Schema(implementation = ErrorCode.class)的字段会自动展示为整数类型,可选值为所有枚举的errorId,同时附带每个错误码的说明。

方案2:Springfox Swagger 2.x 旧版本

自定义属性构建插件实现:

import com.fasterxml.classmate.ResolvedType;
import com.google.common.base.Optional;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.ModelPropertyBuilder;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin;
import springfox.documentation.spi.schema.contexts.ModelPropertyContext;
import java.util.Arrays;
import java.util.stream.Collectors;

@Component
public class ErrorCodeEnumPlugin implements ModelPropertyBuilderPlugin {
    @Override
    public void apply(ModelPropertyContext context) {
        Optional<ResolvedType> resolvedType = context.getResolvedType();
        if (resolvedType.isPresent() && resolvedType.get().getErasedType() == ErrorCode.class) {
            ModelPropertyBuilder builder = context.getBuilder();
            // 设置允许值为所有errorId
            builder.allowableValues(Arrays.stream(ErrorCode.values())
                    .map(ErrorCode::getErrorId)
                    .collect(Collectors.toList()));
            // 补充错误码说明
            String desc = Arrays.stream(ErrorCode.values())
                    .map(e -> e.getErrorId() + ": " + e.getErrorMsg())
                    .collect(Collectors.joining("\n"));
            builder.description("错误码说明:\n" + desc);
            // 字段类型设置为整数
            builder.type(Integer.class);
        }
    }

    @Override
    public boolean supports(DocumentationType delimiter) {
        return DocumentationType.SWAGGER_2 == delimiter;
    }
}

轻量临时方案(无需全局配置)

直接在ErrorCode枚举类上通过@Schema注解硬编码允许值,适合枚举项少且变更频率低的场景:

@Getter
@Schema(description = "错误码枚举", allowableValues = {"100001", "100002", "300003"})
public enum ErrorCode implements BaseError {
    // 原有枚举项保持不变
}

内容的提问来源于stack exchange,提问作者du-it

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:03