2016-05-29 14 views
0

Ich versuche, eine Hilfsmethode zu schreiben, die mir hilft, Ausnahmebedingungsnachrichten für alle Validierungsfehler in Bezug auf die Bean-Validierung in meiner Anwendung aufzubauen. Wenn ich mein Ziel bestätigen (in diesem Fall BasicContactInformation) ich es wie folgt:Java generics Wildcard-Operator

Set<ConstraintViolation<BasicContactInformation>> constraintViolations = validator.validate(basicContactInformation); 
     if(!CollectionUtils.isEmpty(constraintViolations)){ 
      throw new CustomerAccountException(LoggingUtils.getLoggingOutput("Unable to update customer contact information", constraintViolations)); 
     } 

ich für andere Bohnen das Gleiche tue. Die Hilfsmethode nimmt ein Präfix für die Ausnahmebedingungsnachricht zusammen mit dem Satz von Einschränkungsvalidierungen und erstellt eine formatierte Ausgabenachricht. Das Problem ist, ich kann nicht herausfinden, wie man die Nachricht so baut, dass sie eine Reihe von Constraint-Verletzungen jeglicher Art akzeptieren kann. Ich habe versucht, die folgenden, aber es scheint nicht gültig zu sein, da sie es kippe Guss sagt:

public static String getLoggingOutput(String prefix, Set<ConstraintViolation<?>> violations){ 
    StringBuilder outputBuilder = new StringBuilder(prefix); 
    if(!CollectionUtils.isEmpty(violations)){ 
     for(ConstraintViolation<?> currentViolation: violations){ 
      outputBuilder.append("["); 
      outputBuilder.append(currentViolation.getMessage()); 
      outputBuilder.append("]"); 
     } 
    } 
    return outputBuilder.toString(); 
} 

Dies ist der Compiler-Fehler

The method getLoggingOutput(String, Set<ConstraintViolation<?>>) in the type LoggingUtils is not applicable for the arguments (String, Set<ConstraintViolation<BasicContactInformation>>) 

Jede Idee, was die Methodensignatur sollte so sein, dass es für einen Satz von Constraint-Verletzungen funktioniert? Ich versuche, eine Methode zu vermeiden, zu schreiben, die für foo, eine für Bar, eine für baz usw.

Antwort

1

Sie können die Methode machen generic in einer Reihe von Einschränkungsverletzungen nimmt:

public static <T> String getLoggingOutput(String prefix, 
     Set<ConstraintViolation<T>> violations) { 
    // ... 
} 

Unter den meisten Umstände, wenn nicht alle, der Compiler wird den Typ Parameter aus dem Argument ableiten. Dies ist nicht das Gleiche wie die Verwendung eines Platzhalters.