收集实例未按预期行事

时间:2017-02-07 05:33:48

标签: java spring validation collections

我正在通过实现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;

// ...

原因是因为我以前这样做过,但需要更改它,因为我应该使用的标准需要这个框架。

1 个答案:

答案 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