收集实例不按预期行事

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)

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

mir*_*sif 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;
}
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)