@ExceptionHandler не работает при сбое автоматической привязки в REST API - PullRequest
1 голос
/ 17 октября 2019

У меня есть два GET POST API REST

Когда в методе создается какое-либо исключение, обработчик исключений работает нормально. Но если я использую неправильно сформированный REST api uri, то он показывает только 400 Bad Request, не переходя в обработчик исключений.

Например.

Если я нажимаю http://localhost:8080/mypojoInteger/abc,, он не может разобрать строку вЦелое число и, следовательно, я ожидаю, что это пойдет в ExceptionHandler. Он не переходит к обработчику исключений, вместо этого я вижу только 400 ошибочных запросов.

Он отлично работает и переходит к обработчику исключений, когда любое исключение выдается внутри метода GET / POST.

Например,: Он отлично работает и переходит в обработчик исключений, если я использую 123 в переменной пути http://localhost:8085/mypojoInteger/123

и меняю метод getData на

 @GetMapping("/mypojoInteger/{sentNumber}")
    public void getData(@PathVariable("sentNumber") Integer sentNumber) {
    throw new NumberFormatException("Exception");    
    }

ПРИМЕЧАНИЕ. Та же проблема возникает и с запросом POST.

  1. GET:
   @GetMapping("/mypojoInteger/{sentNumber}")
   public void getData(@PathVariable("sentNumber") Integer sentNumber) {
   //some code    
   }
POST:
 public void postData(@RequestBody MyPojo myPojo) {
    //some code
  }

Класс Controller Advice:

@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(NumberFormatException.class)
    protected ResponseEntity<Object> handleEntityNotFound(
            NumberFormatException ex) {

         // some logic
    }
}

Как я могу обработать Исключение, когда оно не может связать String с Integer в самом REST API uri ??

РЕДАКТИРОВАТЬ: мое требование заключается в том, что я должен обрабатывать переполнение целочисленного значения, т. Е. Если передача больше, чем максимальное значение целого числа, он должен обрабатывать его, а не генерировать трассировку стека NumberFormatException.

Например: когдая передаю значение потока

POJO:

public class MyPojo extends Exception {

    private String name;

    private Integer myInt;

//getters/setter
}
{
    "name":"name",
    "myInt":12378977977987879
}

Без @ControllerAdvice он просто показывает NumberFormatException StackTrace. С @ControllerAdvice это просто показывает 400 неправильных запросов без объекта ответа. Я не хочу этот неправильный запрос stacktrace / 400 по умолчанию в этом случае, но я хочу показать свое пользовательское сообщение.

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Проблема в том, что объект Integer не отправляется как valid request parameter, пример запроса: 5, если вы отправляете строку, исключение будет выдано напрямую. Если вы хотите проверить, является ли это String или Integer, вы можете изменить свой код следующим образом:

@GetMapping("/mypojoInteger/{sentNumber}")
public void getData(@PathVariable("sentNumber") Object sentNumber) {
    if (!(data instanceof Integer)) {
        throw new NumberFormatException("Exception");    
    }        
}

Это должно работать на вашем примере.

0 голосов
/ 18 октября 2019

Решение:

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

@Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
    //Handle Bad Request
    }
0 голосов
/ 17 октября 2019

Причина, по которой я вижу, состоит в том, что, поскольку сам запрос искажен, тело метода никогда не выполняется, следовательно, исключение не происходит, поскольку оно предназначено только для обработки ошибки в методе. Вероятно, для вас лучше выбрать правильное тело запроса, чем позволять ему выполнять какой-либо метод, чтобы вы знали проблему заранее.

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