我有以下 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,它们都应该工作。不是吗?
Immutables 或 javax 验证是否存在问题?请帮忙。