У меня есть следующие POJO:
import java.util.Optional;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.immutables.value.Value;
@Value.Immutable
public interface ABC {
Optional<@NotBlank String> test();
Optional<@Size(max = 280) String> testSize();
}
Я использую валидацию javax для проверки объектов класса ABC следующим образом:
public static Set<TestConstraintViolation> validateInternalTest(final Object type, final Class<?>... groups) {
Set<TestConstraintViolation> violations = new HashSet<>();
for (Method method : type.getClass().getInterfaces()[0].getDeclaredMethods()) {
try {
VALIDATOR.validateReturnValue(
type,
method,
method.invoke(type),
groups).forEach(constraint -> {
TestConstraintViolation testConstraintViolation = new TestConstraintViolation(
method.getName(),
constraint.getMessageTemplate()
);
violations.add(testConstraintViolation);
});
} catch (IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("", e);
}
}
return violations;
}
Теперь, когда я пытаюсь проверить с помощью этого валидатораФункциональные объекты ABC, я вижу странную проблему:
@Test
public void test() {
ABC abc = ABCType.builder().build();
assertThat(validateInternalTest(abc))
.hasViolation("test", "{javax.validation.constraints.NotBlank.message}");
ABC abc2 = ABCType.builder().test("test").build();
assertThat(validateInternalTest(abc2))
.hasNoViolations();
}
С объектом abc, он возвращает нарушения, если тест не пройден, даже если он является необязательным, но не пройдя testSize, работает нормально.
По мне, с Optional оба должны работать.Не так ли?
Это какая-то проблема с неизменяемостью или проверкой javax?Пожалуйста, помогите.