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.