Swagger为何不再将标记[Required]的int?属性显示为可空?
问题说明
我定义了如下可空整数属性:
public int? Test { get; set; }
对应的Swagger定义为:
test integer($int32) nullable: true
但当我给该属性添加[Required]特性后:
[Required] public int? Test { get; set; }
Swagger定义变成了:
test* integer($int32)
为什么此时这个属性不再被标记为可空?
原因解析
[Required]特性与可空值类型的组合,会被Swashbuckle(生成Swagger文档的常用工具)解读为字段必须存在且不能为null。当你给int?加上[Required],相当于明确要求该属性必须有有效值,不能是null,因此Swagger不再显示nullable: true。- 从语义逻辑来看,
[Required]强制请求中必须包含该字段,而可空值类型原本允许null,两者结合后就排除了null的可能性——既然字段必须存在,又被要求必填,Swagger会默认它不能为null,所以移除了可空标记。 - 如果你需要“字段必填但允许为null”的语义,这种写法本身存在冲突。因为在ASP.NET Core的模型验证逻辑里,
[Required]对可空值类型默认会判定null不符合要求,无法实现“必填且可空”的效果。
内容的提问来源于stack exchange,提问作者brunofer42
相关产品推荐
相关产品推荐

