如何在OpenAPI描述中添加自定义验证标签以生成带验证的Go结构体?
问题:如何在OpenAPI中配置以自动生成带自定义验证标签的Go结构体?
我正在学习用Go语言对接OpenAPI规范,已编写YAML文件用于生成请求和响应的Go结构体。部分结构体需要自定义验证器,我已通过以下代码实现并注册了email验证器:
var validate *validator.Validate func init() { validate = validator.New() if err := validate.RegisterValidation("email", validateEmail); err != nil { logger.Fatalf("Couldn't register email validator, err=%v", err) } } func validateEmail(fl validator.FieldLevel) bool { email := fl.Field().String() emailRegex := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$` return regexp.MustCompile(emailRegex).MatchString(email) }
现在我可以手动在结构体中使用validate:"email"标签:
type SomeStruct struct { Email string `validate:"email"` }
请问能否在OpenAPI描述中配置相关内容,以自动生成带有该自定义验证标签的Go结构体?
解决方案
- 使用Go生态中常用的OpenAPI代码生成工具oapi-codegen,可以通过自定义扩展字段实现这个需求。在OpenAPI的YAML文件里,给需要添加验证标签的字段加上
x-go-validator扩展,指定你的自定义验证规则名称:
components: schemas: SomeStruct: type: object properties: Email: type: string x-go-validator: "email"
- 执行代码生成命令时,需要启用validator标签生成功能,加上
--enable-validator参数:
oapi-codegen --package api --enable-validator openapi.yaml > api/api.go
- 生成后的Go结构体将自动带上
validate:"email"标签:
type SomeStruct struct { Email string `json:"Email" validate:"email"` }
- 注意:生成工具只负责添加验证标签,自定义验证逻辑(比如你写的
validateEmail函数)需要提前在代码中注册好,才能让验证器正常工作。
内容的提问来源于stack exchange,提问作者Cross
相关产品推荐
相关产品推荐

