如何在 Spring Boot 中验证类型“java.lang.Boolean”

Nob*_*ita 7 java validation spring-boot javax.validation

我有一个布尔字段,我想验证它是否只有“真”或“假”作为值(不带引号)。但是这个字段也允许“真”或“假”作为我想限制的值(带引号)。

我尝试使用 @Pattern 注释来匹配这些值。但我有以下错误:

javax.validation.UnexpectedTypeException:HV000030:找不到约束“javax.validation.constraints.Pattern”验证类型“java.lang.Boolean”的验证器。检查“可重启”的配置

我的代码是:

@Pattern(regexp = "^(true|false)$", message = "restartable field allowed input: true or false")
private Boolean restartable;
Run Code Online (Sandbox Code Playgroud)

我该怎么办?有没有其他方法可以克服这个问题?提前致谢。

Tec*_*aft 10

如果目标是强制执行非空值和真值,您可以使用@NotNull@AssertTrue@AssertFalse存在于 javax.validation 中的断言。

https://docs.oracle.com/javaee/7/tutorial/bean-validation001.htm

@NotNull
@AssertTrue
private Boolean restartable;
Run Code Online (Sandbox Code Playgroud)

如果值可以是 true 或 false,则 Not Null 注释就足够了,因为 Java 中的布尔值只能有两个值。


Log*_*ith 7

我在布尔值的表单验证方面遇到了类似的问题,从技术上讲,我只希望客户端传递 true 或 false,没有其他值,以确保他们理解他们实际上正在传递这些值,而不是传递整数和我的代码基于 false 的解释值运行(Boolean.valueOf() 对于除 true 之外的任何值基本上都返回 false)。

为了澄清问题陈述,由于有些人看起来有点困惑,布尔验证在这里失败,因为他们可以通过

{...
"value":8675309,
...}
Run Code Online (Sandbox Code Playgroud)

其中 value 应该是布尔值(但显然作为 int 传递),但是验证器/转换器只是在传入的对象上运行 Boolean.valueOf() ,在这种情况下将导致 false,这可能会导致下游逻辑和更改客户端没有预料到(即,如果布尔值类似于 keepInformation,则上述情况可能会导致用户丢失所有信息,因为表单未正确验证,并且您可能会陷入困境,因为客户端没有这样做) t“技术上”说“keepInformation”:false)

不管怎样,为了解决这个问题,我发现最简单的方法是将布尔值存储为字符串,如下所示

    @NotNull
    @Pattern(regexp = "^true$|^false$", message = "allowed input: true or false")
    private String booleanField;
Run Code Online (Sandbox Code Playgroud)

我已经测试了这个正则表达式,它只会传递“value”:true/“true”或“value”:false/“false”,它会在额外的引号上失败(“value”:“\”true\“ ")、空格("value":"true ") 以及任何其他与我上面输入的内容不匹配的内容。

然后,在该数据对象中您自己的 getter 中,您可以自己运行布尔转换以供下游使用。

    public boolean isSomething() {
        return Boolean.valueOf(booleanField);
    }
Run Code Online (Sandbox Code Playgroud)


Ósc*_*pez 1

为什么要在布尔字段上使用文本验证?这就是错误所指出的。

我认为检查它是否为 null 更有意义(使用@NotNull);如果它非空,那么它肯定是一个有效的布尔值,根据定义,除了 true 或 false 之外,它不能有任何其他值。另一方面,如果它为空,那么这可能就是您想要检测的错误。

  • 这是事实,但是任何作为“String”的值都会在解析时通过“valueOf”(我相信)。因此布尔值将可用,但值“这是一个测试”仍然会产生“false”,而不是抛出适当的错误。 (3认同)