Pytanie Czy możliwe jest, aby puste wartości RequestParam używały wartości defaultValue?


jeśli mam odwzorowanie żądania podobne do następującego:

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

A następnie zadzwoń do tej prośby za pomocą:

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

Otrzymuję komunikat o błędzie

Nie można skonwertować wartości typu "java.lang.String" na typ "int"; Zagnieżdżony wyjątek to java.lang.NumberFormatException: dla ciągu wejściowego: "" "

Mogę rozwiązać ten problem, albo zatrzymując klienta javascript od wysyłania pustych parametrów, albo akceptując wartości łańcuchowe i analizując tylko, jeśli nie zostaną one uznane za puste.

AKTUALIZACJA: Późniejsze wersje sprężyny teraz realizują pierwotnie pożądane zachowanie.

Właśnie testowałem to wiosną 4.3.5 i odkryłem, że to zachowanie zmieni teraz wartość pustą do wartości domyślnej bez podnoszenia NumberFormatException, w ten sposób; moje oryginalne mapowanie działa teraz poprawnie.

Nie jestem pewien, która wersja wiosny była tą zmianą behawioralną.


76
2017-09-06 09:08


pochodzenie


z pewnością parametr byłby typu Integer, aby podnieść ten wyjątek? - laher
nie jestem ekspertem od wiosny, ale czy domyślna wartość jest używana, gdy jej nie ustawisz? tj. jeśli twoja prośba będzie example.com/test ? jak używasz example.com/test?i= wtedy i jest obecny i ustawiony na "", więc wartość domyślna nie jest używana - user902383
Dzięki amir75, przypadkowo dostarczone String rodzaj. user902383, to prawda, ale dla wartości całkowitej wolałbym, aby zamiast pustej wartości używał wartości defaultValue. - Brett Ryan


Odpowiedzi:


Możesz zmienić typ @RequestParam na Integer i sprawić, że nie będzie to wymagane. Umożliwiłoby to twojemu wnioskowi powodzenie, ale wtedy byłaby zerowa. Możesz jawnie ustawić go na wartość domyślną w metodzie sterownika:

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

Usunąłem wartość defaultValue z powyższego przykładu, ale możesz ją uwzględnić, jeśli spodziewasz się otrzymywać żądania, które nie są w ogóle ustawione:

http://example.com/test

119
2017-09-22 00:18



Właśnie aktualizacja tego, ostatnie wersje wiosny faktycznie nie wymagają już sprawdzenia zerowego, ponieważ pożądane zachowanie zostało dołączone do sprężyny, że puste wartości spowodują użycie wartości domyślnej. - Brett Ryan
Nieaktualne odpowiedzi, najlepsze rozwiązanie pochodzi z @AppLend - Jose Pose S


Możesz zachować typ pierwotny, ustawiając domyślną wartość, w twoim przypadku po prostu dodaj "required = false" własność:

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

P.S. Ta strona z dokumentacji Spring może być przydatna: Adnotacja Typ RequestParam


68
2018-02-20 08:40



Dzięki, ale przegapiłeś punkt mojego pytania, który jest w tytule. Poprosiłem o możliwość dostarczenia pustych parametrów /test?i= i od tego czasu i jest pusty mają domyślną wartość. - Brett Ryan
W każdym razie, kiedy defaultValue zostało dostarczone, required == false niejawnie - Timur Milovanov
Jeśli podano parametr, ale jest pusty defaultValue nie wchodzi w życie. - Brett Ryan
co jeśli param jest listą ??? długich na przykład !!!! - Mohammed Housseyn Taleb


Możesz ustawić RequestParam, używając ogólnej klasy Integer zamiast int, to rozwiąże twój problem.

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

3
2018-02-19 09:38





Możesz też zrobić coś takiego -

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

1
2018-01-19 05:05