How to validate nested POJO with spring validator

28 views Asked by At

I thought @Valid annotation would enable validation for nested POJO. But it fails with IllegalArgumentException.

I have two POJO

# EmailAddress.java

import jakarta.validation.constraints.Email;

public class EmailAddress {
    
    @Email
    private final String value;

    public EmailAddress(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

# Person.java
import jakarta.validation.Valid;

public class Person {
    
    @Valid
    private EmailAddress email;

    public void setEmail(EmailAddress email) {
        this.email = email;
    }

    public EmailAddress getEmail() {
        return email;
    }
}

My test fails with illegal argument exception

    @Test
    public void testInvalidEmailAddress() {
        Person person = new Person();
        EmailAddress email = new EmailAddress("invalid");
        person.setEmail(email);

        Errors errors = validator.validateObject(person);
        assertEquals(1, errors.getErrorCount());
    }

The error happening

java.lang.IllegalArgumentException: Cannot retrieve value for field 'email.value' - neither a getter method nor a raw field found
 at org.springframework.validation.SimpleErrors.getFieldValue(SimpleErrors.java:145)
 at org.springframework.validation.SimpleErrors.rejectValue(SimpleErrors.java:104)
 at org.springframework.validation.beanvalidation.SpringValidatorAdapter.processConstraintViolations(SpringValidatorAdapter.java:180)
 at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:106)

I expected validateObject method not to throw exception.

0

There are 0 answers