java - Spring JSR-303 ConstraintValidator 不支持 list.add()
问题描述
我遇到过这样的误解:我使用自己的注释@Category
和类进行了验证CategoryValidator implements ConstraintValidator<Category, String>
一切都是关于 list.add() 导致(没有它正常工作):
请求处理失败;嵌套异常是 javax.validation.ValidationException: HV000028: isValid 调用期间出现意外异常。
有人可以给我任何解释吗?
类别验证器
@Component
public class CategoryValidator implements ConstraintValidator<Category, String> {
@Autowired
ProductService productService;
List<String> allowedCategories;
@Override
public void initialize(Category constraintAnnotation) {
allowedCategories = Arrays.asList(constraintAnnotation.allowedCategories());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// This .add() it not working here
// allowedCategories.add("Laptop");
for (String category : allowedCategories) {
if (category.equalsIgnoreCase(value)) {
return true;
}
}
return false;
}
}
类别
@Target( { METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = CategoryValidator.class)
@Documented
public @interface Category {
String message() default "{com.ehr.webstore.validator.Category.message}";
Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() default {};
String[] allowedCategories();
}
产品
public class Product {
/* [...] */
@Category(allowedCategories = {"Laptop", "Tablet", "Smart Phone", "Another"})
private String category;
/* [...] */
}
解决方案
好吧,使用完整的堆栈跟踪会更容易,但我认为您的问题是您不能将元素添加到List
created by Arrays.asList()
:它是不可变的。
如果您希望能够添加新元素,则需要执行以下操作:new ArrayList<>( Arrays.asList( ... ) )
.
推荐阅读
- javascript - 为什么我的函数不能读取组件状态的实际值?
- ruby - 如何检查方法的主体?
- uproot - 如何将两个连根拔起的锯齿状数组合并为一个
- python - 使用 Pandas Style 我得到 KeyError: "None of .... are in the [columns]
- google-apps-script - 如何将应用程序脚本中的 Sheets.Spreadsheets.getByDataFilter 用于在电子表格中创建的过滤器视图?
- reactjs - 无法在 React 中更新表单数据
- reactjs - 样式化的组件条件不能正常工作
- google-cloud-platform - GCP 上 PySpark 集群的空闲删除配置
- c# - 如何确保我的测试正确启动和运行?
- javascript - 更新 - 以编程方式更改输入字段后无法按退格键