如何在Swagger响应示例Schema中设置非空属性
Swagger响应Schema设置属性非空的替代方案
不用在视图模型上标记[Required](避免混淆业务验证和Swagger文档定义),可以试试以下几种方案:
1. 自定义Swashbuckle Schema过滤器
通过实现ISchemaFilter,手动指定模型属性的非空规则,完全分离业务验证和文档定义:
public class RequiredPropertiesSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { // 针对目标视图模型处理 if (context.Type != typeof(YourViewModel)) return; // 设置指定属性为非空 if (schema.Properties.TryGetValue("TargetProperty", out var propSchema)) { propSchema.Nullable = false; // 同时添加到required列表,符合OpenAPI规范 schema.Required.Add("TargetProperty"); } } }
然后在Swagger注册时添加这个过滤器:
services.AddSwaggerGen(c => { c.SchemaFilter<RequiredPropertiesSchemaFilter>(); });
2. 使用[DataMember(IsRequired = true)]标记
如果你的视图模型使用[DataContract]特性,可以通过[DataMember(IsRequired = true)]来标记Swagger需要显示为非空的属性,Swashbuckle会自动识别这个配置:
[DataContract] public class YourViewModel { [DataMember(IsRequired = true)] public string NonNullableProperty { get; set; } public string NullableProperty { get; set; } }
3. 手动映射模型Schema
如果只是个别模型需要调整,直接在Swagger配置里手动定义Schema:
services.AddSwaggerGen(c => { c.MapType<YourViewModel>(() => new OpenApiSchema { Type = "object", Properties = new Dictionary<string, OpenApiSchema> { ["NonNullableProperty"] = new OpenApiSchema { Type = "string", Nullable = false }, ["NullableProperty"] = new OpenApiSchema { Type = "string", Nullable = true } }, Required = new HashSet<string> { "NonNullableProperty" } }); });
关于[JsonProperty(Required = Required.DisallowNull)]无效的说明
Swashbuckle默认不会将Newtonsoft.Json的JsonProperty(Required)设置直接映射到OpenAPI的Schema规则,因为这个标记更多是用于序列化时的验证,而非文档定义。上面的方案更贴合Swagger文档的需求。
内容的提问来源于stack exchange,提问作者Valdeci Rodrigues Junior
相关产品推荐
相关产品推荐

