Чи можливо для порожніх значень RequestParam використовувати defaultValue?


120

якщо у мене є запит на картографування, подібний до наступного:

@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'; вкладений виняток - java.lang.NumberFormatException: Для введення рядка: "" '

Я можу це вирішити, або зупинивши клієнт javascript від надсилання порожніх параметрів, або прийнявши рядкові значення та лише проаналізувавши, якщо вони не будуть виявлені порожніми.

ОНОВЛЕННЯ : Більш пізні версії весни тепер реалізують спочатку бажану поведінку.

Я щойно перевірив це навесні 4.3.5 і виявив, що поведінка тепер фактично перетворить нульове значення у значення за замовчуванням, не підвищуючи NumberFormatException, таким чином; моє оригінальне відображення зараз працює чудово.

Я не впевнений, у якій версії весни було здійснено цю поведінкову зміну.


безумовно, параметр буде типом Integer, щоб підняти цей виняток?
laher

3
Я не весна експерт, але чи використовується значення за замовчуванням, коли ви його не встановлюєте? тобто якщо ваш запит буде example.com/test ? як ви використовуєте example.com/test?i=, тоді я присутній і встановлено значення "", тому значення за замовчуванням не використовується
user902383

Дякую amir75, випадково поставляється Stringтипу. user902383, це правильно, хоча для цілого значення я вважаю за краще, щоб значення null / empty використовувало замість цього defaultValue.
Бретт Райан

Відповіді:


175

Ви можете змінити тип @RequestParam на Цілий і зробити його не обов'язковим. Це дозволить вашому запиту досягти успіху, але це було б недійсним. Ви можете явно встановити його за замовчуванням у методі контролера:

@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

6
Тільки оновлення цього, останні версії весни фактично більше не вимагають перевірки нуля, оскільки бажана поведінка була включена до весни, що порожні значення призведуть до використання значення за замовчуванням.
Бретт Райан

3
Застарілі відповіді, найкраще рішення - від @AppLend
Jose Pose S

101

Ви можете зберегти примітивний тип, встановивши значення за замовчуванням, у вашому випадку просто додайте властивість "потрібно = помилково" :

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

PS Ця сторінка з весняної документації може бути корисною: Тип анотації RequestParam


1
Дякую, але ви пропустили пункт мого питання, який є в заголовку. Я попросив можливість подавати порожні параметри, /test?i=і оскільки iпорожній має значення за замовчуванням.
Бретт Райан

5
У будь-якому разі, коли defaultValueбуло надано, required == falseнеявно
Тимур Мілованов

4
Якщо параметр наданий, але порожній, defaultValueвін не набирає чинності.
Бретт Райан

12

Ви можете встановити RequestParam, використовуючи загальний клас Integer замість int, це вирішить вашу проблему.

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

1

Ви також можете зробити щось подібне -

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

3
Якщо у вас є defaultValue, немає необхідності робити це необов’язковим.
Кевін М

1

Цю помилку вважали у 2013 році: https://jira.spring.io/browse/SPR-10180

і було виправлено версією 3.2.2. Проблема не повинна виникати в жодних версіях після цього, і ваш код повинен працювати нормально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.