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

Swagger中ExceptionMiddleware的ErrorCode枚举显示数值而非字符串问题

问题分析与解决方案

核心问题根源

  1. Swagger中ErrorCode枚举显示数值:你在Program.cs配置的JsonStringEnumConverter仅作用于MVC控制器的序列化逻辑,但Swagger的Schema生成默认未同步该配置,导致它对ErrorCode枚举的Schema仍按数值生成;而示例显示字符串,大概率是模型属性的其他逻辑(比如特性)覆盖了示例值。
  2. ExceptionResponse需手动加[JsonPropertyName]:你在ExceptionMiddleware中调用JsonSerializer.Serialize时,使用了默认序列化选项(默认首字母大写),未传入全局配置的JsonSerializerOptions;而其他模型通过MVC框架处理,自动应用了全局配置,因此无需手动添加特性。

分步解决方案

1. 修复Swagger中ErrorCode枚举的显示问题

在Swagger配置中显式指定枚举按字符串显示,让Schema生成与MVC序列化行为一致:

builder.Services.AddSwaggerGen(c =>
{
    // 全局将所有枚举在Swagger Schema中显示为字符串
    c.DescribeAllEnumsAsStrings();
    
    // 若仅需针对ErrorCode枚举生效,可自定义SchemaFilter
    // c.SchemaFilter<ErrorCodeSchemaFilter>();
});

如果需要精准控制单个枚举,可自定义SchemaFilter:

public class ErrorCodeSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (context.Type != typeof(ErrorCode)) return;
        
        schema.Type = "string";
        schema.Enum.Clear();
        foreach (var enumVal in Enum.GetValues(typeof(ErrorCode)))
        {
            schema.Enum.Add(new OpenApiString(enumVal.ToString()));
        }
    }
}

然后在AddSwaggerGen中注册该Filter:

c.SchemaFilter<ErrorCodeSchemaFilter>();

2. 解决ExceptionResponse属性首字母小写问题

在ExceptionMiddleware中注入全局的JsonSerializerOptions,序列化时传入该配置,替代默认选项:

private readonly RequestDelegate _next;
private readonly JsonSerializerOptions _globalJsonOptions;

// 构造函数注入全局Json配置
public ExceptionMiddleware(RequestDelegate next, IOptions<JsonOptions> jsonOptions)
{
    _next = next;
    _globalJsonOptions = jsonOptions.Value.JsonSerializerOptions;
}

// 异常处理逻辑中使用全局配置序列化
var exceptionResp = new ExceptionResponse 
{ 
    ErrorCode = ErrorCode.InvalidRequest, 
    Message = "请求参数无效" 
};
var jsonStr = JsonSerializer.Serialize(exceptionResp, _globalJsonOptions);
await context.Response.WriteAsync(jsonStr);

这样无需给ExceptionResponse的属性手动添加[JsonPropertyName],自动应用全局的驼峰命名规则(前提是你已在全局配置中设置PropertyNamingPolicy = JsonNamingPolicy.CamelCase)。

验证全局配置完整性

确保Program.cs中的MVC Json配置包含以下关键项:

builder.Services.AddControllers()
    .AddJsonOptions(o =>
    {
        o.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:25:22