Установить ограничение по размеру для параметра запроса

#java #spring #rest

#java #spring #rest

Вопрос:

В настоящее время у меня есть API, подобный этому:

     @GetMapping(/user/{id})
    public ResponseEntity<MyClass> getById(@PathVariable @Max(value = Long.MAX_VALUE, message= ID_LENGTH_EXCEED_MESSAGE) Long id) {
      //some code here 
        return  new ResponseEntity<>(HttpStatus.OK);
    }
  

Проблема в том, что я использую API таким образом:

     {baseUrl}/user/1111111111111111111111111111111111111111111
  

Я получаю сообщение об ошибке, подобное этому:

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

Есть ли у вас какие-либо идеи, как ограничить длину значения в переменной path или даже в параметре запроса и получить пользовательское сообщение с ограниченным доступом?

Комментарии:

1. просто подумайте, если вы можете написать подобное long l = 1111111111111111111111111111111111111111111L; на Java, если вы можете, вы также можете сделать выше, поскольку перед тем, как вы создадите пользовательское исключение, библиотека уже генерирует исключение при установке длинного значения,

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

3. @dkb Да, я понимаю это, но я ожидаю ограничить размер или максимальное значение в самом контроллере.

4. @BathriNathan Я использовал там длинный

5. См.: github.com/spring-projects/spring-framework/issues/11041 , эта функция находится в очереди на реализацию, но есть некоторые обходные пути, все равно проблема будет сохраняться, потому что длинный идентификатор должен сначала содержать значение, прежде чем с ним сработает проверка, поэтому либо вы меняете на String и выполняете проверку, либо используете пользовательский обработчик исключений.

Ответ №1:

Кажется, java не может обрабатывать слишком большое число как int или long, поэтому обрабатывает как string и использует свойство length строки для обработки и разбора в int или long.

Примечание: если длина строки слишком велика, чем может поддерживать integer или long, используйте функцию возврата или любую функцию обратного вызова.

Диапазон переменных Java:-

введите описание изображения здесь

Комментарии:

1. Означает ли это, что значение, которое мы отправляем в качестве id, должно быть в диапазоне от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807, чтобы мы могли применить @Max

2. @SudipBolakhe да, определенно, это ограничение для переменной, проверьте это на целое число, я буду работать. как и ожидалось

Ответ №2:

Здесь описано, как выдавать пользовательские ошибки. Я бы предложил принять String as value для идентификатора пользователя. Когда синтаксический анализ value завершается неудачей, вы можете выдать свою пользовательскую ошибку.

Комментарии:

1. Звучит полезно. Но есть ли какой-либо способ ограничить размер или максимальное значение в самом контроллере.

2. Извините, но я не знаю другого способа сделать это.

Ответ №3:

  1. Измените входной параметр (id) этого метода службы rest с Long на String

    затем проверьте длину строки и выполните проверку здесь
  2. Затем преобразуйте это строковое значение в long, как показано ниже:

    Long idValue = Long.valueOf(Id);

    теперь добавьте сюда свой существующий код