2012-02-18 26 views
6

que tienen un método de acción definido como este en uno de mis controladores:¿Cómo devolver el estado de error y los errores de validación de este controlador Spring MVC?

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Post create(@Valid Post post, BindingResult bindingResult) { 
    if (bindingResult.hasErrors()) { 
     // how to return an error status + error messages from here? 
    } else { 
     postRepository.persist(post); 
     return post; 
    } 
} 

Cuando el puesto se conserva con éxito, me devuelven el mensaje de vuelta al cliente. Pero cuando tiene errores de validación, quiero devolver al cliente un código de estado de error y todos los mensajes de error de validación.

¿Cuál es la mejor manera de hacerlo?

+0

¿Está diseñando API o manejando Formulario? –

+0

Estoy diseñando una API REST. –

Respuesta

7

Sine está desigining una API REST, que necesita para crear su propio Pojo (aka. Recursos) que representará el comportamiento o errores de validación impares, según lo declarado por horaceman. Te mostraré cómo lo hacemos en nuestra aplicación.

Dado que estamos utilizando JSON como una representación de datos, deseamos recibir la siguiente información si ocurre una excepción inesperada.

{ "status" : "EXCEPTION", "exceptionName" : "MyCustomException", "exceptionMsg" : "ex.unsupportedOperation" } 

Esto es un ejemplo, por supuesto. Una buena solución al respecto es que podemos tratar exceptionMsg como una clave en nuestra interfaz para mostrar el mensaje i18n o mostrarlo al usuario tal como está (en este caso, utilizamos mensajes más descriptivos).

Ahora, cuando todo está bien que hacer algo como esto:

{ "status" : "OK", "data" : {(...)} } 

Data elemento es opcional. Podemos enviar lo que necesitemos para notificar al frontend, o saltearlo por completo.

El último escenario sería suyo - errores de validación. En este caso enviamos generalmente siguiente contenido:

{ "status" : "VALIDATION_FAILED", "errors" : [ "fieldName" : "username", "errorCode" : "validation.requiredField", "errorMsg" : "Username is required."] } 

tan claramente clientes API recibirán información que la validación ha fallado y en los campos apropiados - detalles exactos sobre lo que salió mal. Por supuesto, errors es una matriz (o List), por lo que siempre proporcionamos tantos detalles como sea necesario.

¿Cómo lo hago? Fácil, esos objetos son POJOS simples que se traducen a JSON usando Jackson. Esto me da posibilidades ilimitadas de representación JSON. Lo que hago es preparar un POJO que represente errores de Validación (por ejemplo) y agregarlo como Model a mi instancia ModelAndView. Entonces solo confío en Spring para hacer los cálculos JSON correctos.

En su caso tiene la anotación @ResponseBody con su instancia Post, por lo que yo sé, no podrá hacerlo. Su configuración dice: "Bueno, pase lo que pase, siempre devuelva una instancia de publicación". Lo que debe hacer es reemplazarlo por simple ModelAndView, suministrarlo con Model según la validación y devolverlo a la API del cliente.

+0

¡Gracias! 1k alcanzado: D –

3

Creo que desea hacer una llamada ajax en su controlador. devuelve un objeto de publicación en el método, por lo que es imposible devolver otro objeto (como un mensaje de error con código). ¿Qué tal si devuelves ExecutionResult?

ExecutionResult{ 
private int statusCode; 
private String message; 
private Object yourPost; 
//get and set methods here... 
} 
3

Para @ResponseBody Eliminaría BindigResult de la firma del método y dejaría que se lanzara BindException.Luego usaría un método @ExceptionHandler para devolver un objeto que contenga los errores como lo describió Likacz.

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Post create(@Valid Post post) { 
    postRepository.persist(post); 
    return post; 
} 

@ExceptionHandler 
public ValidationErrors handleException(BindException ex) { 
    // ... 
} 
+0

Tenga en cuenta que si desea devolver 'ValidationErrors' en el cuerpo de la respuesta, el método' handleException' necesitará '@ ResponseBody'. – CorayThan

Cuestiones relacionadas