Swagger中ExceptionMiddleware的ErrorCode枚举显示数值而非字符串问题
问题分析与解决方案
核心问题根源
- Swagger中ErrorCode枚举显示数值:你在
Program.cs配置的JsonStringEnumConverter仅作用于MVC控制器的序列化逻辑,但Swagger的Schema生成默认未同步该配置,导致它对ErrorCode枚举的Schema仍按数值生成;而示例显示字符串,大概率是模型属性的其他逻辑(比如特性)覆盖了示例值。 - 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
相关产品推荐
相关产品推荐

