我在对布尔值进行表单验证时遇到了类似的问题,从技术上讲,我只希望客户端传递 true 或 false,没有其他值,以确保他们理解他们实际上是在传递这些值,而不是传递整数和我的代码基于 false 的解释值运行(Boolean.valueOf() 基本上对除 true 之外的任何内容都返回 false)。
为了澄清问题陈述,由于有些人看起来有点困惑,布尔验证在这里失败,因为它们可以通过
{...
"value":8675309,
...}
其中 value 应该是布尔值(但显然是作为 int 传递的),但是验证器/转换器只是在传入的对象上运行 Boolean.valueOf() ,在这种情况下会导致错误,这可能会导致下游逻辑和更改客户没有预料到(即,如果布尔值类似于keepInformation,则上述情况可能会导致用户丢失所有信息,因为表单未正确验证,并且您可能会因为客户没有而陷入困境' t “技术上”说“keepInformation”:假)
无论如何,为了解决这个问题,我发现最简单的方法是将布尔值存储为这样的字符串
@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);
}