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 中的布尔值只能有两个值。
我在布尔值的表单验证方面遇到了类似的问题,从技术上讲,我只希望客户端传递 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)
为什么要在布尔字段上使用文本验证?这就是错误所指出的。
我认为检查它是否为 null 更有意义(使用@NotNull);如果它非空,那么它肯定是一个有效的布尔值,根据定义,除了 true 或 false 之外,它不能有任何其他值。另一方面,如果它为空,那么这可能就是您想要检测的错误。
| 归档时间: |
|
| 查看次数: |
19798 次 |
| 最近记录: |