diff --git a/validator.go b/validator.go index 2cae8f7ec..342c4ec24 100644 --- a/validator.go +++ b/validator.go @@ -173,7 +173,7 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr // structs. Since it's basically nonsensical to use `required` with a non-pointer struct // are explicitly skipping the required validation for it. This WILL be removed in the // next major version. - if !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag { + if isNestedStruct && !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag { ct = ct.next } } diff --git a/validator_test.go b/validator_test.go index 1dfa85cca..09ff1dfe2 100644 --- a/validator_test.go +++ b/validator_test.go @@ -13534,3 +13534,26 @@ func TestNestedStructValidation(t *testing.T) { }) } } + +func TestTimeRequired(t *testing.T) { + validate := New() + validate.RegisterTagNameFunc(func(fld reflect.StructField) string { + name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0] + + if name == "-" { + return "" + } + + return name + }) + + type TestTime struct { + Time time.Time `validate:"required"` + } + + var testTime TestTime + + err := validate.Struct(&testTime) + NotEqual(t, err, nil) + AssertError(t, err.(ValidationErrors), "TestTime.Time", "TestTime.Time", "Time", "Time", "required") +}