Home  >  Article  >  Backend Development  >  Issue with required_if combination in github.com/go-playground/validator/v10 package

Issue with required_if combination in github.com/go-playground/validator/v10 package

WBOY
WBOYforward
2024-02-11 11:54:08410browse

github.com/go-playground/validator/v10 包中的 required_if 组合问题

php editor Baicao is here to introduce to you a question about the required_if combination in the github.com/go-playground/validator/v10 package. When using this package for data validation, sometimes we need to determine whether other fields are required based on the value of a certain field. At this time, you can use the required_if combination rule to achieve this requirement. It can determine whether a field is required based on specified conditions, which is very flexible and practical. In this article, we will detail how to use required_if combination rules to solve this problem.

Question content

Software package version, for example. v9, v10:

Package version: v10

Questions, problems or improvements: When I try to run the code below. I'm getting this error, it's wired

Output

Validation error: Key: 'Application.Applicants[0].Entity.Name' Error:Field validation for 'Name' failed on the 'required' tag
Key: 'Application.Applicants[0].Entity.TaxID' Error:Field validation for 'TaxID' failed on the 'required' tag
Key: 'Application.Applicants[1].Person.Name' Error:Field validation for 'Name' failed on the 'required' tag
Key: 'Application.Applicants[1].Person.Age' Error:Field validation for 'Age' failed on the 'required' tag
Key: 'Application.Applicants[1].Person.Email' Error:Field validation for 'Email' failed on the 'required' tag

Code examples for demonstration or reproduction:

package main

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

type Application struct {
    Applicants []Applicant `validate:"dive"`
}

type Applicant struct {
    ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"`
    Person            Person `validate:"required_if=ApplicantCategory PERSON"`
    Entity            Entity `validate:"required_if=ApplicantCategory ENTITY"`
}

type Person struct {
    Name  string `validate:"required"`
    Age   int    `validate:"required,gte=18"`
    Email string `validate:"required,email"`
}

type Entity struct {
    Name  string `validate:"required"`
    TaxID string `validate:"required"`
}

func main() {
    // Create a new validator instance
    v := validator.New()

    // Create an instance of Application to validate
    data := Application{
        Applicants: []Applicant{
            {
                ApplicantCategory: "PERSON",
                Person: Person{
                    Name:  "John Doe",
                    Age:   25,
                    Email: "[email protected]",
                },
            },
            {
                ApplicantCategory: "ENTITY",
                Entity: Entity{
                    Name:  "Example Corp",
                    TaxID: "123456789",
                },
            },
        },
    }

    // Use the validator to validate the Application struct and its Applicants
    if err := v.Struct(data); err != nil {
        fmt.Println("Validation error:", err)
    } else {
        fmt.Println("Validation passed")
    }
}

Unable to identify a problem in the code or validation package. Any help would be greatly appreciated...

Workaround

Add omitempty For example:

type Applicant struct {
    ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"`
    Person            Person `validate:"required_if=ApplicantCategory PERSON,omitempty"`
    Entity            Entity `validate:"required_if=ApplicantCategory ENTITY,omitempty"`
}
Full example in

playground (note that this will not run reliably in the Playground due to the size of the number of imported packages).

The problem is that required_if causes the library to check if Person//Entity exists, but the library still validates an empty Person/Entity (and fails!). Adding omitempty means that the library will ignore empty struct; this provides the desired result because required_if will ensure that any required struct Not empty (meaning it will be validated).

Another option is to use pointers (playground):

type Applicant struct {
    ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"`
    Person            *Person `validate:"required_if=ApplicantCategory PERSON"`
    Entity            *Entity `validate:"required_if=ApplicantCategory ENTITY"`
}

The difference here is that when there is no Entity, the value will be nil (as opposed to Entity which has a default value), which means validator Unable to verify.

Note: I recommend using v := validator.New(validator.WithRequiredStructEnabled()) (as per documentation).

The above is the detailed content of Issue with required_if combination in github.com/go-playground/validator/v10 package. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete