Я получаю HttpMessageNotReadableException, когда пытаюсь сделать сообщение с недопустимым значением для логического поля в java Spring boot со следующим вводом:
{
"User":"xyz",
"email":"xyz@email.com",
"isAdmin":"No" ( This is Boolean in my API Bean expecting true or false)
}
Я получаю ниже сообщения об ошибках в консоли и Тело ответа соответственно:
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'yes': was expecting ('true', 'false' or 'null')at [Source: (PushbackInputStream); line: 29, column: 29]
Ниже тело ответа:
{
"Code": "JSON_REQUEST_INVALID",
"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Unrecognized token 'yes': was expecting ('true', 'false' or 'null'); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unrecognized token 'yes': was expecting ('true', 'false' or 'null')\n at [Source: (PushbackInputStream); line: 29, column: 7] (through reference chain: com.sample.model.apibeans.userDetails[\"user\"])",
"path": "/userapi/v1"
}
Однако я хочу, чтобы сообщение об ошибке было более конкретным c, например, «да» Не допускается в поле "isAdmin"! так как вышеприведенное сообщение не дает много информации о том, какое поле вызвало ошибку.
Я использовал ниже @ControllerAdvice, чтобы перехватить и переопределить сообщение, однако я не могу получить поле, в котором произошла эта ошибка , Ниже приведена реализация метода обработки исключений.
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
@ResponseBody
protected Errors handleHttpMessageNotReadableException(InputMismatchException ex, WebRequest request) {
Errors errors = new Errors();
Error error;
error = new Error();
error.setParams(null);
error.setMessage("Json Contains "+ex.getCause());
error.setTraceId(request.getHeader(TRACE_ID_HEADER_NAME));
error.setStatus(Integer.toString(HttpStatus.BAD_REQUEST.value()));
error.setCode("JSON_REQUEST_INVALID");
errors.addErrorsItem(error);
return errors;
}
Ex-объект не предоставляет никакого метода для получения пути или поля, где это произошло. Как я могу получить эту информацию, чтобы предоставить более конкретное c сообщение об ошибке для потребителя.
Примечание: я использую Spring Boot 2.2.1
Я уже видел другие подобные вопросы о переполнении стека однако ни один из них не смог решить эту проблему.