2014-07-17 18 views
5

Ho creato un servizio di Spring MVC REST utilizzando Bean Validation 1.2 con il seguente metodo:Primavera Bean Validation @Valid manipolazione

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

} 

Se oggetto non è valido, Tomcat mi informa che The request sent by the client was syntactically incorrect. e la mia non è mai validatedMethod chiamato.

Come è possibile ottenere il messaggio definito nel bean ValidObject? Dovrei usare qualche filtro o intercettore?

So che posso riscrivere come qui di seguito, per ottenere il set di ConstraintViolation s dal iniettato Validator, ma quanto sopra sembra più pulito ...

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

risposta

4

Prova questo

@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

Cheers, funziona come un fascino :) Sarebbe bello, non doverlo fare per ogni metodo convalidato. – Dormouse

+0

@Dormouse controlla la mia risposta :) – dharam

12

Credo che un modo migliore per farlo sia usare ExceptionHandler.

Nel Controller è possibile scrivere ExceptionHandler per gestire diverse eccezioni. Di seguito è riportato il codice per lo stesso:

@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()]))); 
} 

Quando si invia una brutta richiesta al controller, il validatore genera un'eccezione di tipo MethodArgumentNotValidException. Quindi il modo ideale sarebbe scrivere un gestore di eccezioni per gestire specificamente questa eccezione.

Qui puoi creare una bella risposta per dire all'utente cose che sono andate storte. Io sostengo questo, perché devi scrivere questo solo una volta e molti metodi Controller possono usarlo. :)

UPDATE

Quando si utilizza l'annotazione @Valid per un argomento metodo nella Controller, il validatore viene invocato automaticamente e tenta di convalidare l'oggetto, se l'oggetto non è valido, si getta MethodArgumentNotValidException .

Se Spring trova un metodo ExceptionHandler per questa eccezione, eseguirà il codice all'interno di questo metodo.

Devi solo assicurarti che il metodo sopra sia presente nel tuo controller.

Ora c'è un altro caso in cui si dispone di più Controller s in cui si desidera convalidare gli argomenti del metodo. In questo caso ti suggerisco di creare una classe ExceptionResolver e di mettere questo metodo lì. Fai sì che il tuo Controller prolunghi questa classe e il tuo lavoro sia finito.

+0

Ok, questo sembra ASCIUTTO. Potresti elaborare un po 'di più? Come faccio a collegarlo al mio 'validatedMethod'? Oh, e il metodo manca di un nome. – Dormouse

+0

Non è necessario. Vedi il mio aggiornamento. – dharam

+0

'ValidationFailureResponse' sembra non essere in nessuna delle mie dipendenze, e Google non pensa che esista. Quale dipendenza Maven potrei aggiungere? – Dormouse

Problemi correlati