2016-04-11 12 views
7

Wenn die PathVariable 'name' die Validierung nicht besteht, wird eine javax.validation.ConstraintViolationException ausgelöst. Gibt es eine Möglichkeit, den Parameternamen in der ausgelösten javax.validation.ConstraintViolationException abzurufen?Abrufen des Feldnamens, wenn javax.validation.ConstraintViolationException ausgelöst wird

@RestController 
@Validated 
public class HelloController { 

@RequestMapping("/hi/{name}") 
public String sayHi(@Size(max = 10, min = 3, message = "name should have between 3 and 10 characters") @PathVariable("name") String name) { 
    return "Hi " + name; 
} 
+1

Did arbeitest du das aus? – ptimson

Antwort

5

Die folgende Exception Handler zeigt, wie es funktioniert:

@ExceptionHandler(ConstraintViolationException.class) 

ResponseEntity<Set<String>> handleConstraintViolation(ConstraintViolationException e) { 
    Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations(); 

Set<String> messages = new HashSet<>(constraintViolations.size()); 
messages.addAll(constraintViolations.stream() 
     .map(constraintViolation -> String.format("%s value '%s' %s", constraintViolation.getPropertyPath(), 
       constraintViolation.getInvalidValue(), constraintViolation.getMessage())) 
     .collect(Collectors.toList())); 

return new ResponseEntity<>(messages, HttpStatus.BAD_REQUEST); 

} 

Sie den ungültigen Wert (Name) mit

constraintViolation.getInvalidValue() 

zugreifen können Sie den Namen der Eigenschaft 'Name' mit Zugriff auf

constraintViolation.getPropertyPath() 
+0

Danke Stefan, aber ich suche den Parameternamen, nicht den Wert. Im obigen Beispiel möchte ich auf "name" zugreifen. – Josh

+0

hinzugefügt, wie der 'Name' –

+7

Ich habe versucht, aber GetPropertyPath gibt sayHi.arg0 – Josh

2

Ich hatte t Das gleiche Problem, aber auch "sayHi.arg0" von getPropertyPath. Ich habe beschlossen, NotNull-Annotationen eine Nachricht hinzuzufügen, da sie Teil unserer öffentlichen API waren. Wie:

@NotNull(message = "timezone param is mandatory") 

können Sie die Nachricht erhalten, durch den Aufruf

ConstraintViolation # getMessage()

1

Verwendung dieses Verfahren (ex ist ConstraintViolationException Instanz):

Set<ConstraintViolation<?>> set = ex.getConstraintViolations(); 
    List<ErrorField> errorFields = new ArrayList<>(set.size()); 
    ErrorField field = null; 
    for (Iterator<ConstraintViolation<?>> iterator = set.iterator();iterator.hasNext();) { 
     ConstraintViolation<?> next = iterator.next(); 
     System.out.println(((PathImpl)next.getPropertyPath()) 
       .getLeafNode().getName() + " " +next.getMessage()); 


    }