NumberFormatException On ResourceController не может привести от строки к целому числу - PullRequest
1 голос
/ 16 января 2020

У меня есть этот контроллер с методом get, который получает 3 параметра как java.lang.Integer

@GetMapping(path = Constantes.CONSULTAR_NODO_SUCESOR)
    public ConsultarNodoSucesorResponse consultarNodoSucesor(@RequestHeader HttpHeaders headerRequest,
                                                             @RequestParam(required = false) Integer idArbol, 
                                                             @RequestParam(required = false) Integer nivelFormulario, 
                                                             @RequestParam(required = false) Integer idSucesor,
                                                             @RequestParam(required = false) String rutaRelacion, 
                                                             @RequestParam(required = false) String tipoRelacion, 
                                                             HttpServletResponse headerResponse) {
        ConsultarNodoSucesorRequest request = new ConsultarNodoSucesorRequest(idArbol, nivelFormulario, idSucesor,
                rutaRelacion, tipoRelacion);
        return service.consultarNodoSucesor(headerRequest, request, headerResponse);
    }

При предположении, что сервер возвращает код 400 для неверного запроса, полная ошибка ниже

Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: \"4111111111\

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

Почему это так? каково максимальное значение Integer

1 Ответ

2 голосов
/ 16 января 2020

В отличие от значения 1044444444 значение 4111111111 слишком велико для типа данных int (и, следовательно, Integer), поэтому понимается как String. Значение выходит за допустимый диапазон для целого числа.

См. Примитивные типы данных :

int : по умолчанию тип данных int представляет собой 32-разрядное целое число со знаком, состоящее из двух чисел со знаком. , который имеет минимальное значение -231 и максимальное значение 231-1.

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

Некоторые аннотированные аргументы метода контроллера, которые представляют ввод запроса на основе строки (например, @RequestParam, @RequestHeader, @PathVariable, @MatrixVariable и @CookieValue) могут потребовать преобразования типа, если аргумент объявлен как-то отличный от String.

В таких случаях преобразование типа выполняется автоматически применяется на основе настроенных преобразователей. По умолчанию поддерживаются простые типы (int, long, Date и другие). Вы можете настроить преобразование типов с помощью WebDataBinder (см. DataBinder) или путем регистрации средств форматирования с помощью FormattingConversionServic e. См. Форматирование пружинных полей .

...