Saltar al contenido

Cómo devolver un mensaje de error en spring mvc @Controller

Hacemos una verificación exhaustiva cada artículo de nuestro espacio con la meta de enseñarte en todo momento la información certera y certera.

Solución:

Como ya señaló Sotirios Delimanolis en los comentarios, hay dos opciones:

Devolver ResponseEntity con mensaje de error

Cambia tu método así:

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity getUser(@RequestHeader(value="Access-key") String accessKey,
                              @RequestHeader(value="Secret-key") String secretKey) 
    try 
        // see note 1
        return ResponseEntity
            .status(HttpStatus.CREATED)                 
            .body(this.userService.chkCredentials(accessKey, secretKey, timestamp));
    
    catch(ChekingCredentialsFailedException e) 
        e.printStackTrace(); // see note 2
        return ResponseEntity
            .status(HttpStatus.FORBIDDEN)
            .body("Error Message");
    

Nota 1: No tienes que usar el ResponseEntity builder, pero creo que ayuda a mantener el código legible. También ayuda a recordar qué datos debe incluir una respuesta para un código de estado HTTP específico. Por ejemplo, una respuesta con el código de estado 201 debe contener un enlace al recurso recién creado en el Location encabezado (consulte Definiciones de código de estado). Esta es la razón por la que Spring ofrece el método de compilación conveniente ResponseEntity.created(URI).

Nota 2: no usar printStackTrace()use un registrador en su lugar.

proporcionar un @ExceptionHandler

Elimina el bloque try-catch de tu método y deja que lance la excepción. Luego crea otro método en una clase anotada con @ControllerAdvice como esto:

@ControllerAdvice
public class ExceptionHandlerAdvice 

    @ExceptionHandler(ChekingCredentialsFailedException.class)
    public ResponseEntity handleException(ChekingCredentialsFailedException e) 
        // log exception
        return ResponseEntity
                .status(HttpStatus.FORBIDDEN)
                .body("Error Message");
            

Tenga en cuenta que los métodos que están anotados con @ExceptionHandler se les permite tener firmas muy flexibles. Vea el Javadoc para más detalles.

Aquí hay una alternativa. Cree una excepción genérica que tome un código de estado y un mensaje. A continuación, cree un controlador de excepciones. Utilice el controlador de excepciones para recuperar la información de la excepción y volver a la persona que llama del servicio.

http://javaninja.net/2016/06/lanzar-excepciones-mensajes-spring-mvc-controller/

public class ResourceException extends RuntimeException 

    private HttpStatus httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;

    public HttpStatus getHttpStatus() 
        return httpStatus;
    

    /**
     * Constructs a new runtime exception with the specified detail message.
     * The cause is not initialized, and may subsequently be initialized by a
     * call to @link #initCause.
     * @param message the detail message. The detail message is saved for later retrieval by the @link #getMessage()
     *                method.
     */
    public ResourceException(HttpStatus httpStatus, String message) 
        super(message);
        this.httpStatus = httpStatus;
    

Luego use un controlador de excepciones para recuperar la información y devolverla a la persona que llama al servicio.

@ControllerAdvice
public class ExceptionHandlerAdvice  

    @ExceptionHandler(ResourceException.class)
    public ResponseEntity handleException(ResourceException e) 
        // log exception 
        return ResponseEntity.status(e.getHttpStatus()).body(e.getMessage());
             
 

Luego crea una excepción cuando lo necesites.

throw new ResourceException(HttpStatus.NOT_FOUND, "We were unable to find the specified resource.");

Aquí tienes las reseñas y calificaciones

Finalizando este artículo puedes encontrar los comentarios de otros sys admins, tú igualmente puedes dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *