Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可选,对于使用Javax验证的不可变类,@NotBlank-giving-error和@Size-not-giving_Java_Javabeans_Immutables Library - Fatal编程技术网

可选,对于使用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结合使用对我来说似乎不是一个明智的主意。

  • jsr380
    规范(Bean验证2.0)将空选项(
    Optional.empty()
    )视为
    null

  • >p>大多数约束(包括@ size)不认为<代码> null <代码>是一个约束违反,这就是为什么空选项(处理为<代码> null >代码>传递验证的原因。这也是人们经常遇到
    @NotNull@Size(min=1,max=2)字符串x的原因(即检查大小和notnull)

  • 然而,
    @NotBlank
    约束是不允许
    null
    s的例外之一(认为它们是违规的)。这就是为什么
    @NotBlank
    会失败,而大多数其他人不会

Hibernate验证程序问题也提出了类似的问题。请参见本期的第一个回复(由纪尧姆·斯密特撰写):

这是我们在编写BeanValidation2.0规范时做出的选择。我们考虑一个空的可选值为null。

大多数约束都不关心,因为它们对于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();
}