首页 > 解决方案 > 可选,@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 验证是否存在问题?请帮忙。

标签: javajavabeansimmutables-library

解决方案


什么是可选类型? Optional 是包装单个值的新容器类型(如果该值可用)。因此,它旨在传达该值可能不存在的含义。以这种方法为例:

如果您使用 Optional,这意味着价值可能不存在,并且将 @NotBlank 与 Optional 结合使用对我来说似乎不是一个明智的主意。


推荐阅读