Глобальный обработчик исключений Spring Boot не захватывает исключение HttpMessageNotReadableException - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть глобальный обработчик исключений, который прекрасно работает для захвата исключений, генерируемых моим контроллером, сервисным уровнем или уровнем хранилища.Тем не менее, он не может перехватить исключения, которые возникают до входа в мой контроллер.В частности, у меня есть контроллер POST, который ожидает допустимое тело json, если фактическое тело json искажено, выдается HttpMessageNotReadableException, и я понятия не имею, где было обработано это исключение.Код ответа действительно 400. Так что мой вопрос в том, как использовать мою собственную логику для захвата и обработки исключения десериализации сообщений, которое происходит перед входом в мой контроллер.

Мой глобальный обработчик исключений (он отлично работает для исключений, выданных из моегоуровень обслуживания)

@ControllerAdvice(basePackageClasses = TopologyApiController.class)
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
  private static final String UNKNOWN_SERVER_ERROR_MSG = "Unknown server error";

  @ExceptionHandler(value = {ServiceException.class})
  public ResponseEntity<ErrorResponse> handleServiceException(Exception ex, WebRequest request) {
    // some handling
    return generateExceptionResponseEntity(errorMessage, status);
  }

  @ExceptionHandler(value = {Exception.class})
  public ResponseEntity<ErrorResponse> handleGeneralException(Exception ex, WebRequest request) {
    return generateExceptionResponseEntity(UNKNOWN_SERVER_ERROR_MSG, HttpStatus.INTERNAL_SERVER_ERROR);
  }

  private ResponseEntity<ErrorResponse> generateExceptionResponseEntity(String message, HttpStatus status) {
    ErrorResponse response = new ErrorResponse();
    response.setMessage(message);
    return ResponseEntity.status(status).body(response);
  }
}

Мой POST контроллер (ожидает десериализации тела json в CityInfo объект)

@RequestMapping(value = API_BASE + "/topology/cities", method = RequestMethod.POST)
ResponseEntity<CityInfo> topologyCitiesPost(@Valid @RequestBody CityInfo body) {
  CityInfo cityInfo = topologyService.addCity(body);
  return ResponseEntity.status(HttpStatus.CREATED).body(cityInfo);
}

Контроллер ожидает тело json в формениже, и весь код работает нормально, если json действителен.

{
  "description": "string",
  "name": "string",
  "tag": "string"
}

, но если фактическое содержимое будет примерно таким, как показано ниже (например, с несколькими запятыми в конце), будет выброшено HttpMessageNotReadableExceptionи не захвачен моим обработчиком.

{
  "description": "this is description",
  "name": "city name",
  "tag": "city tag",,,,
}

1 Ответ

0 голосов
/ 04 декабря 2018

Это: Так что мой вопрос в том, как использовать мою собственную логику для захвата и обработки исключения десериализации сообщений, которое происходит перед входом в мой контроллер.

Аннотировать инаписать исключениеHandler для этого конкретного исключения.Добавьте это к вашему GlobalExceptionHandler классу:

@ExceptionHandler(HttpMessageNotReadableException.class)
  public ResponseEntity<ErrorResponse> handleMessageNotReadableException(Exception ex, WebRequest request) {
    // some handling
    return generateExceptionResponseEntity(errorMessage, status);
  }
...