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.