jDu*_*ub9 1 java collections validation spring
我正在通过实现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;
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,当我调用Validation时,我正在传递一个ArrayList,但是接收到IllegalArgumentException(Validator类不支持ArrayList).这应该正常吗?因为ArrayList是一个Collection因此(ArrayList instanceof Collection)应该返回true.
如果这个逻辑不正确,请告诉我.这真的让我很紧张.另外,请不要在模型中提及简单的javax验证,例如
// ---- Bean Class
@NotNull
private String attribute;
// ...
Run Code Online (Sandbox Code Playgroud)
原因是因为我以前这样做,但需要更改它,因为我应该使用的标准需要这个框架.
像这样更改您的支持方法
@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;
}
Run Code Online (Sandbox Code Playgroud)
说明
supports方法确定此验证程序是否可以验证类的实例是否可以验证.
正确的实施方式是使用 Class.isAssignable
Collection.class.isAssignableFrom(ArrayList.class); // Returns true
Run Code Online (Sandbox Code Playgroud)
如果使用class.equals以下语句将返回false
Collection.class.equals(ArrayList.class) // Returns false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |