API控制器返回继承DTO时父类字段未在客户端及Swagger中显示
问题解决:继承DTO的父类字段未在Swagger和响应中显示
问题原因
你的BaseDTO中message是公共字段,而ASP.NET Core默认的JSON序列化器(如System.Text.Json)和Swagger Schema生成器,默认只处理带get/set访问器的公共属性,不会识别公共字段,因此该字段既不会出现在Swagger Schema中,也不会被序列化返回给客户端。
解决方案
推荐方案:将字段改为属性
这是.NET DTO设计的最佳实践,修改BaseDTO把字段转为自动属性:
public abstract class BaseDTO { public List<string> Message { get; set; } = new List<string>(); }
子类MyDTO保持不变:
public class MyDTO : BaseDTO { public string Name { get; set; } }
修改后,Swagger会自动识别父类的属性,序列化器也会将Message字段包含在响应中。
备选方案:配置序列化器包含字段(不推荐)
如果必须保留字段形式,可以修改配置让序列化器和Swagger识别字段:
- 配置System.Text.Json序列化器
在Program.cs中添加以下配置:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.IncludeFields = true; });
- 配置Swagger识别字段
自定义SchemaFilter让Swagger显示字段:
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<IncludeFieldsSchemaFilter>(); }); public class IncludeFieldsSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { var publicFields = context.Type.GetFields(BindingFlags.Public | BindingFlags.Instance); foreach (var field in publicFields) { // 以List<string>为例生成对应Swagger Schema,可根据字段类型调整 var fieldSchema = new OpenApiSchema { Type = "array", Items = new OpenApiSchema { Type = "string" } }; schema.Properties.Add(field.Name, fieldSchema); } } }
内容的提问来源于stack exchange,提问作者Behnam Faghih
相关产品推荐
相关产品推荐

