Go语言 嵌入结构的validate方法未使用Ozzo验证调用

epfja78i  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(158)

我使用"github.com/go-ozzo/ozzo-validation/v4"。这是我的struct:

type MyStruct struct {
    UUID          string `json:"uuid"`
    FirstUUID     string `json:"first_uuid"`
    SecondUUID    string `json:"second_uuid"`
    ThirdUUID     string `json:"third_uuid"`
    PhoneNumber   string `json:"phone_number"`
    Email         string `json:"email"`
    SkypeID       string `json:"skype_id"`
}

type MyOtherStruct struct {
    MyStruct
    City          string `json:"city"`
    Comment       string `json:"comment"`
    PersonnelID   string `json:"personnel_id"`
    FirstDate     string `json:"first_date"`
    SecondDate    string `json:"second_date"`
    FirstBoolean  bool   `json:"first_boolean"`
    SecondBoolean bool   `json:"second_boolean"`
}

这些是验证方法:

func (m MyStruct) Validate() error {
    fmt.Println("calling MyStruct validator")

    err := validation.ValidateStruct(
        validation.Field(&uui.UUID, is.UUID),
        validation.Field(&uui.FirstUUID, validation.Required, is.UUID),
        validation.Field(&uui.SecondUUID, validation.Required, is.UUID),
        validation.Field(&uui.ThirdUUID, validation.Required, is.UUID),
        validation.Field(&uui.Email, validation.Required, is.Email),
        validation.Field(&uui.PhoneNumber, validation.Required, validation.Match(mobileRegexp)),
        validation.Field(&uui.SkypeID, validation.Required),
    )

    return err
}

func (m MyOtherStruct) Validate() error {
    fmt.Println("calling MyOtherStruct validator")

    err := validation.ValidateStruct(
        validation.Field(&uui.PersonnelID, validation.Match(personnelIDRegexp)),
        validation.Field(&uui.City, validation.Required),
        validation.Field(&uui.Comment),
        validation.Field(&uui.FirstDate, validation.Date(time.DateOnly)),
        validation.Field(&uui.SecondDate, validation.Date(time.DateOnly)),
    )

    return err
}

这是我发送的请求:

{
    "uuid": "1e57ef49-352f-4545-a43a-b51cad6c5a0a",
    "phone_number": "09124567891",
    "email": "[email protected]",
    "skype_id": "some_skype_id",
    "city": "a city",
    "personnel_id": "",
    "comment": "no comment for now!",
    "first_date": "",
    "second_date": "",
    "first_uuid": "94038913-2bdb-4dde-99fb-640a24e1c003",
    "second_uuid": "7fa0e242-841b-4de0-a3ce-e2b54ecd1bca",
    "third_uuid": "35ab6711-852e-42c8-aab3-dfb901a845f5",
    "first_boolean": true,
    "second_boolean": false
}

我期望func (m MyStruct) Validate()被调用来处理this issue,但是我没有得到日志calling MyOtherStruct validator

dluptydi

dluptydi1#

问题中的源代码与ozzo validation v4 returns field #0 cannot be found in the struct有相同的问题。除此之外,您应该将以下代码添加到(MyOtherStruct).Validate

validation.Field(&m.MyStruct),

试试这个演示(https://go.dev/play/p/CgyJq4WZemi):

package main

import (
    "fmt"

    validation "github.com/go-ozzo/ozzo-validation/v4"
    "github.com/go-ozzo/ozzo-validation/v4/is"
)

type MyStruct struct {
    UUID  string `json:"uuid"`
    Email string `json:"email"`
}

func (m MyStruct) Validate() error {
    fmt.Println("calling MyStruct validator")

    err := validation.ValidateStruct(
        &m,
        validation.Field(&m.UUID, is.UUID),
        validation.Field(&m.Email, validation.Required, is.Email),
    )

    return err
}

type MyOtherStruct struct {
    MyStruct
    City string `json:"city"`
}

func (m MyOtherStruct) Validate() error {
    fmt.Println("calling MyOtherStruct validator")

    err := validation.ValidateStruct(
        &m,
        validation.Field(&m.City, validation.Required),
        // The following line is necessary to make (MyStruct).Validate being called.
        validation.Field(&m.MyStruct),
    )

    return err
}

func main() {
    data := MyOtherStruct{}
    fmt.Printf("validation error: %v\n", data.Validate())
}

请注意,如果您调用(MyStruct).Validate,则不会调用(MyOtherStruct).Validate,因为前者对MyOtherStruct一无所知。

相关问题