我正在通过实现Validator接口实现一些Spring Framework验证。我想支持我的DTO对象,Long(用于主键验证)和Collection,这样我就不需要在我的控制器方法中多次调用Invoke Validation
/*
* (non-Javadoc)
* @see org.springframework.validation.Validator#supports(java.lang.Class)
*/
@Override
public boolean supports(Class<?> clazz) {
Class<?>[] supportedClasses = {
UserDTO.class,
Collection.class,
Long.class
};
for(Class<?> c : supportedClasses){
if(clazz.equals(c)){
return true;
}
}
return false;
}
/*
* (non-Javadoc)
* @see org.springframework.validation.Validator#validate(java.lang.Object, org.springframework.validation.Errors)
*/
@Override
public void validate(Object target, Errors errors) {
if(target instanceof Collection<?>){
Iterator<?> i = ((Collection<?>) target).iterator();
while(i.hasNext()){
validate(i.next(), errors);
}
return;
}
在我的控制器中,当我调用Validation时,我正在传递一个ArrayList,但是接收到IllegalArgumentException(Validator类不支持ArrayList)。这个应该正常工作吗?因为ArrayList是一个集合因此(ArrayList instanceof Collection)应该返回true。
如果这个逻辑不正确,请告诉我。这真的让我很紧张。另外,请不要在模型中提及简单的javax验证,例如
// ---- Bean Class
@NotNull
private String attribute;
// ...
原因是因为我以前这样做过,但需要更改它,因为我应该使用的标准需要这个框架。
答案 0 :(得分:5)
更改您的支持方式
@Override
public boolean supports(Class<?> clazz) {
Class<?>[] supportedClasses = {
UserDTO.class,
Collection.class,
Long.class
};
for(Class<?> c : supportedClasses){
if(clazz.isAssignableFrom(clazz)(c)){
return true;
}
}
return false;
}
<强>解释强>
supports方法确定此验证器是否可以验证类的实例。
正确实施方法是使用Class.isAssignable
Collection.class.isAssignableFrom(ArrayList.class); // Returns true
如果您使用class.equals
以下语句将返回false
Collection.class.equals(ArrayList.class) // Returns false