Подтвердить что ты не робот

Возможно ли, чтобы пустые значения RequestParam использовали defaultValue?

если у меня есть сопоставление запроса, похожее на следующее:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

И затем вызовите этот запрос с помощью:

http://example.com/test?i=

Я получаю сообщение об ошибке

Не удалось преобразовать значение типа 'java.lang.String' в тип 'int'; inested exception is java.lang.NumberFormatException: для строки ввода: ""

Я могу решить это, либо остановив javascript-клиент от отправки пустых параметров, либо приняв строковые значения, и только разбор, если они не считаются пустыми.

UPDATE: более поздние версии spring теперь реализуют изначально желаемое поведение.

Я только что протестировал это в spring 4.3.5 и обнаружил, что теперь поведение фактически превратит нулевое значение в значение по умолчанию, не поднимая NumberFormatException, таким образом; мое исходное отображение теперь отлично работает.

Я не уверен, в какой версии spring было сделано это изменение поведения.

4b9b3361

Ответ 1

Вы можете изменить тип @RequestParam на Integer и сделать его необязательным. Это позволит вашему запросу добиться успеха, но тогда это будет null. Вы можете явно указать его значение по умолчанию в методе контроллера:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

Я удалил defaultValue из приведенного выше примера, но вы можете включить его, если вы ожидаете получить запросы, где он не установлен вообще:

http://example.com/test

Ответ 2

Вы можете сохранить примитивный тип, установив значение по умолчанию, в вашем случае просто добавьте свойство "required = false" :

@RequestParam(value = "i", required = false, defaultValue = "10") int i

P.S. Эта страница из документации Spring может быть полезна: Тип аннотации RequestParam

Ответ 3

Вы также можете сделать что-то вроде этого -

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i

Ответ 4

Вы можете установить RequestParam, используя общий класс Integer вместо int, он решит вашу проблему.

   @RequestParam(value= "i", defaultValue = "20") Integer i