You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gin Gonic提交无效类型数据时自定义校验错误功能失效问题

问题修复方案

根因说明

你的代码中直接对错误做了无校验的强制类型转换,将所有绑定错误都认定为validator.ValidationErrors类型,但Gin参数绑定阶段会返回多类错误:

  • 校验规则不匹配(比如长度不够、数值范围不符合)时返回validator.ValidationErrors
  • 参数类型不匹配、JSON格式非法时返回*json.UnmarshalTypeError等非校验类型错误
    两类错误没有做区分就强制转换,就会触发你遇到的panic。

修复代码

你只需要改造NewValidatorError方法,增加错误类型判断逻辑即可:

import (
    "encoding/json"
    "github.com/go-playground/validator/v10"
    "fmt"
)

type CustomError struct {
    Errors map[string]interface{} `json:"errors"`
}

func NewValidatorError(err error) CustomError {
    res := CustomError{}
    res.Errors = make(map[string]interface{})

    // 安全断言:先判断是否为校验错误
    if validationErrs, ok := err.(validator.ValidationErrors); ok {
        for _, v := range validationErrs {
            param := v.Param()
            field := v.Field()
            tag := v.Tag()

            if param != "" {
                res.Errors[field] = fmt.Sprintf("{%v: %v}", tag, param)
            } else {
                res.Errors[field] = fmt.Sprintf("{key: %v}", tag)
            }
        }
        return res
    }

    // 处理JSON类型不匹配错误
    if typeErr, ok := err.(*json.UnmarshalTypeError); ok {
        res.Errors[typeErr.Field] = fmt.Sprintf("{type: 要求%s类型, 传入为%s类型}", typeErr.Type, typeErr.Value)
        return res
    }

    // 兜底处理其他参数错误
    res.Errors["common"] = fmt.Sprintf("参数错误: %s", err.Error())
    return res
}

效果验证

改造后传入类型不匹配的参数时,不会再触发panic,会返回格式化的类型错误提示:

{
    "errors": {
        "mobile_country_code": "{type: 要求int类型, 传入为string类型}"
    }
}

符合校验规则不匹配的场景逻辑保持不变。

内容的提问来源于stack exchange,提问作者Majid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:09:03