当我们引用了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
    })

不会编程的程序员
56 声望2 粉丝