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
相关产品推荐
相关产品推荐

