2017-02-07 7 views
1

Ich implementiere eine Spring Framework-Validierung durch Implementierung der Validator-Schnittstelle. Ich möchte Unterstützung meine DTO-Objekt, eine Long (für Primärschlüssel Validierung) und eine Sammlung, so dass ich nicht brauchenInstanz der Sammlung funktioniert nicht wie erwartet

/* 
* (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; 
    } 

In meinem Controller die Invoke Validation zahlreiche Male in meinem Controller Methoden aufrufen Wenn ich die Validierung aktiviere, übergebe ich eine ArrayList, erhalte aber eine IllegalArgumentException (Validator-Klasse unterstützt keine ArrayList). Diese sollte funktionieren? Da ArrayList eine Collection ist (ArrayList instanceof Collection) sollte true zurückgegeben werden.

Wenn diese Logik nicht korrekt ist, lass es mich wissen. Das belastet mich wirklich. Bitte erwähnen Sie auch nicht die einfache Java-Validierung in den Modellen, z.

// ---- Bean Class 

@NotNull 
private String attribute; 

// ... 

Der Grund ist, weil ich das vorher tat, aber erforderlich, um es zu ändern, weil die Standards ich diesen Rahmen verwenden sollten erfordert.

+0

zurückkehren Wenn Sie Ihre Fehlermeldung 'Validator-Klasse ist nicht unterstützt ...' Wahrscheinlich liegt es an der 'support()' Methode. Und diese Methode verwendet 'equals', um die Klassen zu prüfen, nicht 'instanceof'. Es kommt also nie zu der Anweisung, die 'instanceof' verwendet. Versuchen Sie [Class.isInstance] (http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isInstance-java.lang.Object-). – ajb

Antwort

4

Ihre Unterstützung Methode ändern wie diese

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

Erklärung

unterstützt Methode bestimmt, ob eine Instanz einer Klasse ist, kann von dieser Prüfung oder nicht validiert werden.

korrekte Art und Weise der Umsetzung es Class.isAssignable

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

verwenden Wenn Sie class.equals folgende Anweisung verwenden falsche

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

Vielen Dank! Das hat super funktioniert. – jDub9

+0

Freut mich zu helfen :) – mirmdasif

Verwandte Themen