解决ASP.NETCore开发中使用Swagger/OpenAPI时,客户端请求遇到反序列化失败(属性不允许为空)的问题。
创建自定义对象过滤器
public class RequireNonNullablePropertiesSchemaFilter : ISchemaFilter
{
/// <summary>
/// Apply 方法将循环检查每个模型属性。将Nullable为false的项添加进添加到Required对象列表中
/// </summary>
public void Apply(OpenApiSchema model, SchemaFilterContext context)
{
var additionalRequiredProps = model.Properties
.Where(x => !x.Value.Nullable && !model.Required.Contains(x.Key))
.Select(x => x.Key);
foreach (var propKey in additionalRequiredProps)
{
model.Required.Add(propKey);
}
}
}
配置Swagger
builder.Services.AddSwaggerGen(c => {
c.SchemaFilter<RequireNonNullablePropertiesSchemaFilter>(); // 添加自定义过滤器
c.SupportNonNullableReferenceTypes(); // 支持空引用类型
c.UseAllOfToExtendReferenceSchemas(); // 允许枚举为空
c.UseAllOfForInheritance(); // 允许对象为空
});