jeśli mam mapowanie żądań 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 z:
http://example.com/test?i=
Otrzymuję komunikat o błędzie
Nie udało się przekonwertować 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, powstrzymując klienta javascript przed wysyłaniem pustych parametrów lub akceptując wartości ciągów i analizując je tylko wtedy, gdy nie okaże się, że są puste.
AKTUALIZACJA : Późniejsze wersje wiosny implementują teraz pierwotnie pożądane zachowanie.
Właśnie przetestowałem to na wiosnę 4.3.5 i stwierdziłem, że to zachowanie w rzeczywistości zmieni wartość null na wartość domyślną bez podnoszenia a NumberFormatException
, zatem; moje oryginalne mapowanie działa teraz dobrze.
Nie jestem pewien, w której wersji wiosny dokonano tej zmiany zachowania.
źródło
String
typ. user902383, to jest poprawne, chociaż dla wartości całkowitej wolałbym, aby wartość null / pusta używała zamiast tego defaultValue.Odpowiedzi:
Możesz zmienić typ @RequestParam na Integer i sprawić, że nie będzie to wymagane. Pozwoliłoby to na pomyślne wykonanie żądania, ale byłoby wówczas nieważne. Możesz jawnie ustawić wartość domyślną w metodzie kontrolera:
Usunąłem wartość defaultValue z powyższego przykładu, ale możesz chcieć ją uwzględnić, jeśli spodziewasz się otrzymywać żądania, w których nie jest ona w ogóle ustawiona:
źródło
Możesz zachować typ pierwotny, ustawiając wartość domyślną, w twoim przypadku wystarczy dodać właściwość „required = false” :
PS Ta strona z dokumentacji Springa może być przydatna: Typ adnotacji RequestParam
źródło
/test?i=
a ponieważi
jest puste, mają wartość domyślną.defaultValue
podano,required == false
pośredniodefaultValue
, nie obowiązuje.Możesz ustawić RequestParam, używając ogólnej klasy Integer zamiast int, rozwiąże to twój problem.
źródło
Możesz też zrobić coś takiego -
źródło
Uznano to za błąd w 2013 roku: https://jira.spring.io/browse/SPR-10180
i został naprawiony w wersji 3.2.2. Problem nie powinien wystąpić w żadnej późniejszej wersji, a Twój kod powinien działać dobrze.
źródło