Soru Boş RequestParam değerleri varsayılanValue kullanmak mümkün mü?


aşağıdakine benzer bir eşleme eşlemem varsa:

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

Ve sonra bu isteği ile ara:

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

Hata mesajı alıyorum

'İnt' yazmak için 'java.lang.String' türünün değeri dönüştürülemedi; iç içe istisna java.lang.NumberFormatException: Giriş dizesi için: "" '

Bunu, javascript istemcisini boş parametreler göndermekten veya dize değerlerini kabul ederek ve yalnızca boş olarak bulunamazsa ayrıştırarak çözebilirim.

GÜNCELLEŞTİRME: İlkbaharın sonraki sürümleri artık istenen davranışları uyguluyor.

Bunu sadece 4.3.5 no.lu yayında test ettim ve şu an davranışların aslında bir artış olmaksızın boş değeri varsayılan değere çevirdiğini buldum. NumberFormatException, Böylece; Orijinal eşleştirmem şimdi iyi çalışıyor.

Bu davranışsal değişikliğin hangi sürümünün yapıldığından emin değilim.


76
2017-09-06 09:08


Menşei


kesinlikle bu istisnayı yükseltmek için bir Tamsayı tipi olurdu? - laher
uzman değil bahar, ama bunu ayarladığınızda varsayılan değer kullanılır? yani isteğiniz example.com/test ? kullandığın gibi example.com/test?i= sonra mevcut ve "" olarak ayarlanmış, varsayılan değer kullanılmıyor - user902383
Teşekkürler amir75, yanlışlıkla teslim edildi String yazın. user902383, bu doğru, bir tamsayı değeri için olsa da, boş / boş bir değerin yerine defaultValue kullanmasını tercih ederim. - Brett Ryan


Cevaplar:


@RequestParam türünü bir Tamsayı olarak değiştirebilir ve gerekli hale getiremezsiniz. Bu, isteğinizin başarılı olmasına izin verir, ancak daha sonra boş olacaktır. Denetleyici yönteminde bunu varsayılan değerinize açık bir şekilde ayarlayabilirsiniz:

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

Yukarıdaki örnekte defaultValue'yi kaldırdım, ancak hiç ayarlanmadığı istekleri almayı beklerseniz eklemek isteyebilirsiniz:

http://example.com/test

119
2017-09-22 00:18



Bununla ilgili bir güncelleme, yayın son sürümleri, boş değerlerin kullanılmakta olan varsayılan değere neden olacağı yay ile birlikte dahil edildiğinden, artık null denetimine gerek kalmaz. - Brett Ryan
Eski cevaplar, en iyi çözüm @AppLend'ten - Jose Pose S


İlkel türünü varsayılan değeri ayarlayarak tutabilirsiniz. "required = false" özelliği:

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

Not; Bahar dokümantasyonundan alınan bu sayfa yararlı olabilir: Ek Açıklama Türü RequestParam


68
2018-02-20 08:40



Teşekkürler ama başlıkta yer alan sorumu kaçırdın. Boş paramik sağlama yeteneği istedim /test?i= dan beri i boş varsayılan değer var. - Brett Ryan
Neyse, ne zaman defaultValue sağlandı, required == false dolaylı olarak - Timur Milovanov
Param sağlanmışsa ancak boş defaultValue etkili olmaz. - Brett Ryan
Param bir liste ise ??? exemple için uzun süredir !!!! - Mohammed Housseyn Taleb


RequestParam'ı int yerine generic class Integer kullanarak ayarlayabilirsiniz, sorununuzu çözer.

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

3
2018-02-19 09:38





Bunun gibi bir şey de yapabilirsin -

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

1
2018-01-19 05:05