可选,对于使用Javax验证的不可变类,@NotBlank-giving-error和@Size-not-giving
我有以下几点建议:可选,对于使用Javax验证的不可变类,@NotBlank-giving-error和@Size-not-giving,java,javabeans,immutables-library,Java,Javabeans,Immutables Library,我有以下几点建议: 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();
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();
}
对于abc对象,如果测试未通过,它将返回冲突,即使它是可选的,但不通过testSize也可以正常工作
根据我的说法,如果是可选的,它们都应该工作。不是吗
不可变或javax验证是否存在问题?请帮忙
什么是可选类型?
可选是包装单个值的新容器类型(如果该值可用)。所以这是为了
传达可能缺少该值的含义。例如
此方法:
如果您使用的是Optional,这意味着value可能不存在,并且将@NotBlank与Optional结合使用对我来说似乎不是一个明智的主意。
规范(Bean验证2.0)将空选项(jsr380
)视为Optional.empty()
null
- 然而,
约束是不允许@NotBlank
s的例外之一(认为它们是违规的)。这就是为什么null
会失败,而大多数其他人不会@NotBlank
@NotNull@Size(min=1,max=2)字符串x的原因代码>(即检查大小和notnull)
大多数约束都不关心,因为它们对于NULL没有失败,但实际上对于<代码> @ NoBLUT>/代码>,我们将NULL视为无效值。
谢谢你的回复。那么,在这里我可以用什么替代@NotBlank呢?在不理解全部要求的情况下,我可以说使用可选或NotBlank
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;
}
@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();
}