not validator.ValidationErrors (types from different packages)

发布于 2022-09-12 02:56:28 字数 1576 浏览 24 评论 0

完成错误:
interface conversion: error is validator.ValidationErrors, not validator.ValidationErrors (types from different packages)

诉求:
写了一个简单的Go gin项目,只有一个功能,所以不会太复杂。写到最后打算封装下基础的部分,于是欲封装下验证这一块。

代码如下:

// Bind : bind request dto and auto verify parameters
func Bind(c *gin.Context, obj interface{}) error {
    _ = c.ShouldBindUri(obj)
    if err := c.ShouldBind(obj); err != nil {
        util.Log.Notice(reflect.TypeOf(err))
        util.Log.Notice(err.(validator.ValidationErrors))
        if fieldErr, ok := err.(validator.ValidationErrors); ok {
            var tagErrorMsg []string
            for _, v := range fieldErr {
                if _, has := ValidateErrorMessage[v.Tag]; has {
                    tagErrorMsg = append(tagErrorMsg, fmt.Sprintf(ValidateErrorMessage[v.Tag], v.Field, v.Value))
                } else {
                    tagErrorMsg = append(tagErrorMsg, err.Error())
                }
            }
            return errors.New(strings.Join(tagErrorMsg, ","))
        }
    }
    return nil
}

引入文件如下:

import (
    "FoodBackend/pkg/util"
    "reflect"
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/pkg/errors"
    "gopkg.in/go-playground/validator.v8"
    "strings"
)

会在这样使用err.(validator.ValidationErrors)时报错。
err的类型也是validator.ValidationErrors

整个项目仅一处使用了这个包,且确定没有其他验证类的包在项目其他文件有引入。
image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

毁虫ゝ 2022-09-19 02:56:28

这个问题我花了点时间找到了根源,见下图。
image.png

早期go-gin使用的go-playground/validator包地址是gopkg.in/go-playground,网上留了大量的资料(随便举几个例:ABC),而现在go-gin使用的是v10,依赖的包地址github.com/go-playground/validator,不是gopkg.in/go-playground/validator.v10,这就造成了这次遇到的问题。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文