首页 > 解决方案 > 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;
/* [...] */
}

标签: javaspringbean-validationhibernate-validator

解决方案


好吧,使用完整的堆栈跟踪会更容易,但我认为您的问题是您不能将元素添加到Listcreated by Arrays.asList():它是不可变的。

如果您希望能够添加新元素,则需要执行以下操作:new ArrayList<>( Arrays.asList( ... ) ).


推荐阅读