当我们引用了go-playground/validator/v10库并且配置了如下内容并配置了中文:
Name string `json:"name" validate:"required"
那么他的返回信息如下:
Name为必填字段
依然不是很友好,这个时候我们就需要自定义错误内容:
名称为必填字段
代码如下:
package utils
import (
CN_ZH "github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTranslations "github.com/go-playground/validator/v10/translations/zh"
"reflect"
)
var Validate *validator.Validate
// Validate/v10 全局验证器
var trans ut.Translator
// 初始化Validate/v10国际化
func init() {
zh := CN_ZH.New()
uni := ut.New(zh, zh)
trans, _ = uni.GetTranslator("zh")
Validate = validator.New()
//通过label标签返回自定义错误内容
Validate.RegisterTagNameFunc(func(field reflect.StructField) string {
label := field.Tag.Get("label")
if label == "" {
return field.Name
}
return label
})
zhTranslations.RegisterDefaultTranslations(Validate, trans)
//自定义required_if错误内容
Validate.RegisterTranslation("required_if", trans, func(ut ut.Translator) error {
return ut.Add("required_if", "{0}为必填字段!", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("required_if", fe.Field())
return t
})
}
// 检验并返回检验错误信息
func Translate(err error) (errMsg string) {
errs := err.(validator.ValidationErrors)
for _, err := range errs {
errMsg = err.Translate(trans)
}
return
}
struct配置如下:
Name string `json:"name" validate:"required" label:"路由name"`
此时返回的内容为:
路由name为必填字段
检验代码如下:
var menu model.SysMenu
_ = c.ShouldBindJSON(&menu)
if err := utils.Validate.Struct(menu); err != nil {
response.FailWithMessage(utils.Translate(err), c)
return
}
坑点:
当我想使用required_if进行判断时候,发现v10库没有加上required_if这个标签,那么你需要自定义:
//自定义required_if错误内容
Validate.RegisterTranslation("required_if", trans, func(ut ut.Translator) error {
return ut.Add("required_if", "{0}为必填字段!", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("required_if", fe.Field())
return t
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。