格式化验证失败的错误信息, 默认tag=err, 支持重置默认tag #3
25
router/config.go
Normal file
25
router/config.go
Normal file
@ -0,0 +1,25 @@
|
||||
// Package router ...
|
||||
//
|
||||
// Description : router ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2025-02-07 17:41
|
||||
package router
|
||||
|
||||
import "strings"
|
||||
|
||||
var defaultValidateErrTag = "err"
|
||||
|
||||
// SetValidateErrTag 设置验证失败时, 获取错误信息的tag字段
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:42 2025/2/7
|
||||
func SetValidateErrTag(tagName string) {
|
||||
tagName = strings.TrimSpace(tagName)
|
||||
if tagName == "" {
|
||||
return
|
||||
}
|
||||
defaultValidateErrTag = tagName
|
||||
}
|
@ -31,6 +31,8 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc {
|
||||
formData := reflect.New(uriCfg.FormDataType).Interface()
|
||||
// 表单解析
|
||||
if err = request.Form.Parse(ctx, formData); nil != err {
|
||||
// 格式化验证错误的信息
|
||||
err = GetValidateErr(formData, err)
|
||||
e = exception.NewFromError(400, err)
|
||||
response.SendWithException(ctx, e, nil)
|
||||
return
|
||||
|
@ -21,7 +21,7 @@ func (t TestController) Logic(ctx *gin.Context, formData *TestForm) (any, error)
|
||||
|
||||
type TestForm struct {
|
||||
Meta `tag:"测试表单" path:"/a/b/c/d" desc:"测试接口" method:"get"`
|
||||
Age int `json:"age" form:"age" binding:"min=20"`
|
||||
Age int `json:"age" form:"age" binding:"min=20" err_msg:"年龄不能小于20"`
|
||||
Name string `json:"name" form:"name"`
|
||||
Test *Test `json:"test" form:"test"`
|
||||
Num *int64 `json:"num" form:"num"`
|
||||
@ -31,6 +31,7 @@ type Test struct {
|
||||
}
|
||||
|
||||
func Test_parseController(t *testing.T) {
|
||||
SetValidateErrTag("err_msg")
|
||||
r := gin.Default()
|
||||
Group(r, "test", nil, TestController{})
|
||||
r.Run(":8080")
|
||||
|
55
router/validator.go
Normal file
55
router/validator.go
Normal file
@ -0,0 +1,55 @@
|
||||
// Package router ...
|
||||
//
|
||||
// Description : router ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2025-02-07 17:36
|
||||
package router
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/go-playground/validator/v10"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// GetValidateErr 格式化错误信息
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 22:19 2025/1/15
|
||||
func GetValidateErr(obj any, rawErr error) error {
|
||||
if nil == rawErr {
|
||||
return nil
|
||||
}
|
||||
if nil == obj {
|
||||
return rawErr
|
||||
}
|
||||
var (
|
||||
ok bool
|
||||
validationErrs validator.ValidationErrors
|
||||
errString []string
|
||||
field reflect.StructField
|
||||
)
|
||||
if ok = errors.As(rawErr, &validationErrs); !ok {
|
||||
return rawErr
|
||||
}
|
||||
objType := reflect.TypeOf(obj)
|
||||
if objType.Kind() == reflect.Ptr {
|
||||
objType = objType.Elem()
|
||||
}
|
||||
for _, validationErr := range validationErrs {
|
||||
if field, ok = objType.FieldByName(validationErr.Field()); ok {
|
||||
if e := field.Tag.Get(defaultValidateErrTag); e != "" {
|
||||
errString = append(errString, fmt.Sprintf("%s: %s", field.Tag.Get("json"), e))
|
||||
continue
|
||||
} else {
|
||||
errString = append(errString, fmt.Sprintf("%s: %v", field.Tag.Get("json"), validationErr.Value()))
|
||||
}
|
||||
}
|
||||
errString = append(errString, validationErr.Error())
|
||||
}
|
||||
return errors.New(strings.Join(errString, "\n"))
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user