Proto3中validate.rules是否可强制字段必填?是否因类型而异?
Protobuf Validate规则的必填性分析
你的示例中,验证规则的必填强制效果因字段类型和规则类型而异,并非全部能直接或间接实现必填,逐个拆解如下:
string 类型(name字段)
规则min_len:1要求字符串长度至少为1。Proto3中字符串未设置时默认是空串"",长度为0,不满足min_len要求,验证会失败——相当于间接强制该字段必须设置非空值,能达到必填效果。int64/int32 类型(minimum_spend_micro、limit字段)
规则gte:1要求数值大于等于1。Proto3中整数类型未设置时默认值是0,0不满足gte:1的条件,验证会失败。不管是未设置字段,还是设置了小于1的数值,都通不过验证,间接实现了必填效果。消息类型(start_time字段)
规则timestamp.required = true是显式的必填声明。Timestamp作为消息类型,未设置时是默认的空消息(所有子字段取默认值),required=true会直接校验该字段是否被显式赋值,未赋值则验证失败,是最直接的必填强制方式。枚举类型(code_type字段)
规则enum.defined_only = true仅要求枚举值是已定义的合法项。Proto3中枚举未设置时默认值是0:- 如果你的
PromoCodeType枚举没有值为0的枚举项,默认的0不属于合法值,验证会失败,相当于间接必填; - 如果枚举中定义了值为0的项(比如常见的
UNKNOWN = 0;),未设置字段时会取这个默认值,验证会通过,此时无法强制必填。
- 如果你的
总结
- 基础类型(字符串、整数)可通过范围/长度规则,利用Proto3默认值不满足规则的特性,间接实现必填;
- 消息类型必须通过
required=true显式声明才能强制必填; - 枚举类型的
defined_only规则能否实现必填,完全取决于枚举是否包含值为0的合法项。
内容的提问来源于stack exchange,提问作者Andrew Cheong
相关产品推荐
相关产品推荐

