Невозможно использовать пользовательское сообщение об ошибке HttpMessageNotReadableException в Spring Boot - PullRequest
0 голосов
/ 12 марта 2019

В настоящее время я пытаюсь предоставить пользовательские сообщения для исключений, но столкнулся с проблемой с HttpMessageNotReadableException.

У меня есть класс ErrorDetails:

public class ErrorDetails {
    private Date timestamp;
    private String message;
    private String details;



    public ErrorDetails(Date timestamp, String message, String details) {
        super();
        this.timestamp = timestamp;
        this.message = message;
        this.details = details;
    }

    public Date getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }

У меня также есть пользовательское исключениеобработчик:

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@RestController
public class CustomizedExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(HttpMessageNotReadableException.class)
    @Override
    public final ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request){
        ErrorDetails errorDetails = new ErrorDetails(new Date(), "hello",request.getDescription(true));
        errorDetails.setMessage("Testing message");
        return new ResponseEntity<>(errorDetails,HttpStatus.NOT_ACCEPTABLE);
    }
}

Но когда я пытаюсь опубликовать неправильный запрос, например, с полем, которое должно иметь целочисленное значение, я передаю строку в JSON, она все равно возвращает сообщение об ошибке по умолчанию:

{
    "timestamp": "2019-03-12T00:15:14.210+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "JSON parse error: Cannot deserialize value of type `int` from String \"lala\": not a valid Integer value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `int` from String \"lala\": not a valid Integer value\n at [Source: (PushbackInputStream); line: 5, column: 17] (through reference chain: com.tdl.model.ToDoNote[\"priority\"])",
    "path": "/todos"
}

Запрос JSON:

{
    "name": "An workout",
    "dateToComplete": "Today",
    "description": "Sleep Day",
    "priority": "lala",
    "completed": false
}

Желаемым эффектом будет просто появление тестового сообщения вместо длинного описания.

Я также получаю это в своем Eclipseconsole:

WARN 16508 --- [nio-5000-exec-4] .wsmsDefaultHandlerExceptionResolver: Resolved [org.springframework.http.converter.HttpMessageNotReadableException: ошибка синтаксического анализа JSON: невозможно десериализовать значение типа1020 * из строки "lala": недопустимое целочисленное значение;вложенным исключением является com.fasterxml.jackson.databind.exc.InvalidFormatException: невозможно десериализовать значение типа int из строки «lala»: недопустимое целочисленное значение в [Source: (PushbackInputStream);строка: 5, столбец: 17] (через цепочку ссылок: com.tdl.model.ToDoNote ["priority"])]

Я изменил статус на NOT_ACCEPTABLE, чтобы более ясно видеть, если мой пользовательскийошибка возвращается.

Любая помощь будет оценена.Спасибо.

РЕДАКТИРОВАТЬ

Добавлено ExceptionHandler для InvalidFormatException, но ничего не изменилось.Я по-прежнему получаю сообщение об ошибке (исключение) по умолчанию, такое же, как и раньше.

@ExceptionHandler(InvalidFormatException.class)
    public final ResponseEntity<Object> handleInvalidFormat(InvalidFormatException ex, HttpHeaders headers, HttpStatus status, WebRequest request){
        ErrorDetails errorDetails = new ErrorDetails(new Date(), "hello",request.getDescription(true));
        errorDetails.setMessage("Testing message");
        return new ResponseEntity<>(errorDetails,HttpStatus.NOT_ACCEPTABLE);

    }

1 Ответ

0 голосов
/ 12 марта 2019

Проблема решена.У меня были свои пользовательские классы исключений в плохо названном пакете.Это называлось просто исключением.Хотя это должно было быть com.app.exception, где весь проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...