У меня есть глобальный обработчик исключений, который прекрасно работает для захвата исключений, генерируемых моим контроллером, сервисным уровнем или уровнем хранилища.Тем не менее, он не может перехватить исключения, которые возникают до входа в мой контроллер.В частности, у меня есть контроллер 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",,,,
}