2014-07-17 11 views
5

ja stworzyliśmy usługę REST przy użyciu MVC wiosny Bean Validation 1.2 z następującym sposobem:Wiosna Bean Validation @Valid zabiegom

@RequestMapping(value = "/valid") 
public String validatedMethod(@Valid ValidObject object) { 

} 

Jeśli obiekt nie jest ważne, Tomcat informuje mnie, że The request sent by the client was syntactically incorrect. i nigdy nie jest mój validatedMethod nazywa.

Jak mogę uzyskać komunikat zdefiniowany w fasoli ValidObject? Czy powinienem użyć filtra lub przechwytywacza?

wiem, że mogę przepisać jak poniżej, aby uzyskać zestaw ConstraintViolation sz wstrzyknięta Validator, ale powyższe wydaje się bardziej schludny ...

@RequestMapping(value = "/valid") 
public String validatedMethod(ValidObject object) { 
    Set<ConstraintViolation<ValidObject>> constraintViolations = validator 
      .validate(object); 
    if (constraintViolations.isEmpty()) { 
     return "valid"; 
    } else { 
     final StringBuilder message = new StringBuilder(); 
     constraintViolations.forEach((action) -> { 
      message.append(action.getPropertyPath()); 
      message.append(": "); 
      message.append(action.getMessage()); 
     }); 
     return message.toString(); 
    } 
} 

Odpowiedz

4

Spróbuj

@RequestMapping(value = "/valid") 
public String validatedMethod(@Valid ValidObject object, BindingResult result) { 
    StringBuilder builder = new StringBuilder(); 
    List<FieldError> errors = bindingResult.getFieldErrors(); 
    for (FieldError error : errors) { 
     builder.append(error.getField() + " : " + error.getDefaultMessage()); 
    } 
    return builder.toString(); 
} 
+0

Wiwaty, działa jak urok :) Byłoby jednak miło, nie trzeba tego robić dla każdej zwalidowanej metody. – Dormouse

+0

@ Dormouse sprawdź moją odpowiedź :) – dharam

12

Uważam, że lepszym sposobem na to jest użycie ExceptionHandler.

W swoim Controller można napisać ExceptionHandler, aby obsłużyć różne wyjątki. Poniżej znajduje się kod dla tego samego:

@ExceptionHandler(MethodArgumentNotValidException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
@ResponseBody 
public ValidationFailureResponse validationError(MethodArgumentNotValidException ex) { 
    BindingResult result = ex.getBindingResult(); 
    final List<FieldError> fieldErrors = result.getFieldErrors(); 

    return new ValidationFailureResponse((FieldError[])(fieldErrors.toArray(new FieldError[fieldErrors.size()]))); 
} 

Po wysłaniu złe żądanie do kontrolera, weryfikator zgłasza wyjątek typu MethodArgumentNotValidException. Idealnym rozwiązaniem byłoby napisanie wyjątku do obsługi wyjątku.

Możesz utworzyć piękną odpowiedź, aby poinformować użytkownika o błędach. Opowiadam się za tym, ponieważ musisz napisać to tylko raz i wiele metod może z niego skorzystać. :)

UPDATE

Podczas korzystania z @Valid adnotacji dla metody argumentem w Controller, walidator jest wywoływany automatycznie i próbuje potwierdzić obiektu, jeśli obiekt jest nieważny, to rzuca MethodArgumentNotValidException .

jeżeli sprężyna znajduje metodę ExceptionHandler tym wyjątkiem będzie wykonywał kod wewnątrz tego sposobu.

Trzeba tylko upewnić się, że powyższa metoda jest obecna w kontrolerze.

Teraz jest inny przypadek, gdy masz wiele Controller s, gdzie chcesz sprawdzić poprawność argumentów metody. W tym przypadku proponuję utworzyć klasę ExceptionResolver i umieścić tam tę metodę. Spraw, aby Twoja klasa Controller rozszerzyła tę klasę i Twoja praca została wykonana.

+0

OK, to wygląda na SUCHE. Czy mógłbyś rozwinąć nieco więcej? Jak połączyć to z moim 'validatedMethod'? Aha, a tej metodzie brakuje nazwy. – Dormouse

+0

Nie musisz. Zobacz moją aktualizację. – dharam

+0

'ValidationFailureResponse' wydaje się nie być w żadnej z moich zależności, a Google nie uważa, że ​​istnieje. Którą zależność Maven mogę dodać? – Dormouse

Powiązane problemy