Ответ 1
Как Sotirios Delimanolis уже указано в комментариях, есть два варианта:
Возврат ResponseEntity
с сообщением об ошибке
Измените свой метод следующим образом:
@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");
}
}
Примечание 1: Вам не нужно использовать конструктор ResponseEntity
, но я считаю, что это помогает с сохранением кода. Он также помогает запоминать, какие данные должны включать ответ для определенного кода состояния HTTP. Например, ответ с кодом состояния 201 должен содержать ссылку на вновь созданный ресурс в заголовке Location
(см. Определения кода состояния), Вот почему Spring предлагает удобный метод сборки ResponseEntity.created(URI)
.
Примечание 2: Не используйте printStackTrace()
, вместо этого используйте регистратор.
Предоставьте @ExceptionHandler
Удалите блок try-catch из вашего метода и дайте ему исключение. Затем создайте еще один метод в классе, аннотированный с помощью @ControllerAdvice
следующим образом:
@ControllerAdvice
public class ExceptionHandlerAdvice {
@ExceptionHandler(ChekingCredentialsFailedException.class)
public ResponseEntity handleException(ChekingCredentialsFailedException e) {
// log exception
return ResponseEntity
.status(HttpStatus.FORBIDDEN)
.body("Error Message");
}
}
Обратите внимание, что методы, аннотированные с помощью @ExceptionHandler
, имеют очень гибкие подписи. Подробнее см. Javadoc.