如何在Bean Validation约束消息中使用EL计算数组长度并解决报错
问题原因
抛出NumberFormatException的根因是:Hibernate Validator做消息插值时,会自动将注解的数组类型属性转换为java.util.List实例,不会保留Java原生数组类型:
- 原生数组支持通过
.length属性读取长度,而List没有该属性 - 表达式
foos.length会被EL解析器识别为调用List.get(Object)方法,尝试将字符串length转换为数字索引,因此触发数字格式异常。
解决方案
将EL表达式中的foos.length替换为List对应的长度获取方法foos.size()即可。如果需要直接输出数组的格式化列表内容,直接引用foos变量即可,Hibernate Validator会自动将其格式化为[元素1, 元素2, 元素3]的形式。
修正后的message注解属性定义如下:
String message() default "Field value should be ${foos.size() == 1 ? foos[0] : 'one of '.concat(foos)}";
修改后运行测试即可符合预期:
- 当
foos数组长度为1时,输出Field value should be foo - 当
foos数组长度大于1时,输出Field value should be one of [foo, bar, baz]
内容的提问来源于stack exchange,提问作者SQB
相关产品推荐
相关产品推荐

