2017-02-07 152 views
1

我正在通過實現Validator接口來實現一些Spring Framework驗證。我想支持我的DTO的對象,一個長(主鍵驗證),以及收集,這樣我就不需要在調用驗證過無數次呼籲在我的控制器方法Instanceof Collection不能像預期的那樣運行

/* 
* (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集合)應該返回true。

如果這個邏輯不正確,請讓我知道。這真的讓我感到壓力。另外,請不要在模型中提及簡單的javax驗證。

// ---- Bean Class 

@NotNull 
private String attribute; 

// ... 

的原因是因爲我在做這個之前,但因爲標準我應該使用需要這個框架去改變它需要的。

+0

如果你的錯誤信息是'驗證類不支持使用Class.isAssignable

Collection.class.isAssignableFrom(ArrayList.class); // Returns true 

的正確方法...' ,這可能是因爲'support()'方法。該方法使用'equals'來檢查類,而不是'instanceof'。所以它永遠不會使用'instanceof'的語句。嘗試[Class.isInstance](http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isInstance-java.lang.Object-)。 – ajb

回答

4

更改支持方法這樣

@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; 
} 

說明

支持方法確定的實例是否是一類能夠通過該驗證或不進行驗證。

實施是如果你使用class.equals下面的語句將返回false

Collection.class.equals(ArrayList.class) // Returns false 
+0

非常感謝!這很好。 – jDub9

+0

歡迎歡迎:) – mirmdasif

相關問題