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
相关产品推荐
相关产品推荐

