You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring JSR-303 ConstraintValidator中list.add()触发ValidationException问题求助

问题原因及解决方案

嘿,这个问题我太熟悉了!你遇到的异常根源在于Arrays.asList()返回的列表特性——它不是一个可修改的ArrayList,而是Java数组的一个固定大小的包装类(java.util.Arrays.ArrayList,注意这和java.util.ArrayList不是同一个类)。这个内部类没有实现add()、remove()这类修改列表大小的方法,一旦调用就会抛出UnsupportedOperationException,而Hibernate Validator把这个异常包装成了你看到的ValidationException。

看你的CategoryValidator代码:

@Override
public void initialize(Category constraintAnnotation) {
    allowedCategories = Arrays.asList(constraintAnnotation.allowedCategories());
}

这里Arrays.asList()返回的列表是固定长度的,对应你注解里定义的4个类别。当你在isValid()里调用allowedCategories.add("Laptop")时,自然就触发了不可修改的异常。

解决方法

只需要在初始化时把这个固定大小的列表转换成真正的可修改ArrayList就行,修改initialize方法:

@Override
public void initialize(Category constraintAnnotation) {
    // 转成可修改的ArrayList
    allowedCategories = new ArrayList<>(Arrays.asList(constraintAnnotation.allowedCategories()));
}

这样之后,你再调用allowedCategories.add("Laptop")就不会再抛异常了。

另外提一句:如果你的allowedCategories需要从ProductService动态获取(毕竟你已经注入了这个服务),也可以在initialize或者isValid里从服务拉取数据,这样比硬编码添加更灵活哦。

内容的提问来源于stack exchange,提问作者ehr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:06:24