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

时间:2019-05-30 15:29:38

标签: java spring-boot validation javax.validation

我有一个布尔字段,我想验证其值为“ true”或“ false”(不带引号)。但是此字段也允许使用“ true”或“ false”作为我要限制的值(带引号)。

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

  

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

我的代码是:

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

我该怎么办?还有其他方法可以解决此问题吗?预先感谢。

3 个答案:

答案 0 :(得分:2)

我在布尔值的形式验证中也遇到了类似的问题,从技术上讲,我只希望客户端传递true或false,不传递其他值,以确保他们理解它们实际上在传递那些值,而不传递整数并且我的代码基于false的解释值运行(除了true以外,Boolean.valueOf()基本上返回false)。

为澄清问题陈述,由于某些人似乎有些困惑,因此布尔验证在这里失败,因为他们可以通过

{...
"value":8675309,
...}

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

无论如何,为了解决这个问题,我发现最简单的方法是将布尔值存储为这样的字符串

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

我已经测试过此正则表达式,并且只能通过“ value”:true /“ true”或“ value”:false /“ false”,否则会在加引号时失败(“ value”:“ \” true \“”),空格(“ value”:“ true”)以及其他与我上面所述不符的内容。

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

    public boolean isSomething() {
        return Boolean.valueOf(booleanField);
    }

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

@NotNull
@AssertTrue
private Boolean restartable;

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