Исключение: com.faster xml .jackson.core.JsonParseException: HttpMessageNotReadableException - PullRequest
1 голос
/ 15 января 2020

Я получаю 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

Я уже видел другие подобные вопросы о переполнении стека однако ни один из них не смог решить эту проблему.

1 Ответ

0 голосов
/ 30 января 2020

Ну, я еще не получил метод java, чтобы получить точное поле, однако из-за шаблона ошибки я завершил извлечение поля ниже, которое может быть полезным.

 String  param= (String) ex.getMessage().subSequence(ex.getMessage().lastIndexOf("[")+1,ex.getMessage().lastIndexOf("]"));

Этот выбор точное поле, где произошла ошибка, и вы предоставляете клиенту динамическое c сообщение, как показано ниже:

  {
"Code": "JSON_REQUEST_INVALID",
"status": 400,
"error": "Bad Request",
"message": "unexpected value at isAdmin",
"path": "/userapi/v1"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...