Возможно ли, чтобы пустые значения 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 было сделано это изменение поведения.
Ответы
Ответ 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