java - 可选,@NotBlank 给出错误,而 @Size 不给出使用 Javax 验证的不可变类
问题描述
我有以下 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 验证是否存在问题?请帮忙。
解决方案
什么是可选类型? Optional 是包装单个值的新容器类型(如果该值可用)。因此,它旨在传达该值可能不存在的含义。以这种方法为例:
如果您使用 Optional,这意味着价值可能不存在,并且将 @NotBlank 与 Optional 结合使用对我来说似乎不是一个明智的主意。
推荐阅读
- c - 在 c 中,system() 在 printf() 之前执行,即使 printf 先出现
- sqlite - 使用 SQLiteStudio 更新查询以将零附加到 blob 字段中
- laravel - 在 Laravel Blade 视图中传递自定义事件
- amazon-web-services - 如何使用蓝/绿部署在代码管道中获取构建的 docker 映像到部署步骤
- angular - 角材料输入 | 如何使“焦点”布局默认
- java - 禁用 SSL 检查安装文件操作
- node.js - 如何在nodejs中使用OR运算符
- c# - 我应该如何处理 API 数据请求者的异常?
- php - Mac OS:未加载国际扩展
- php - makePartial() 返回 Mockery\Exception\BadMethodCallException :此模拟对象上不存在方法