Boş RequestParam değerlerinin defaultValue kullanması mümkün müdür?


120

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

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

Ve sonra bu talebi şu şekilde arayın:

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

Hata mesajını alıyorum

'Java.lang.String' türünün değeri 'int' türüne dönüştürülemedi; iç içe yerleştirilmiş istisna java.lang.NumberFormatException: Giriş dizesi için: "" '

Bunu, javascript istemcisinin boş parametreler göndermesini durdurarak veya dize değerlerini kabul ederek ve yalnızca boş bulunmazlarsa ayrıştırarak çözebilirim.

GÜNCELLEME : İlkbaharın sonraki sürümleri artık başlangıçta istenen davranışı uyguluyor.

Bunu 4.3.5 baharında test ettim ve davranışın şimdi aslında boş değeri a yükseltmeden varsayılan değere dönüştürebileceğini buldum NumberFormatException. orijinal eşlemem artık iyi çalışıyor.

Bu davranış değişikliğinin hangi bahar versiyonunda yapıldığından emin değilim.


kesinlikle parametre bu istisnayı ortaya çıkarmak için bir Tamsayı türü olacaktır?
laher

3
Ben bahar uzmanı değilim, ancak ayarlamadığınızda varsayılan değer kullanılır mı? yani isteğiniz example.com/test olacaksa ? example.com/test?i= kullandıkça , i mevcuttur ve "" olarak ayarlanır, bu nedenle varsayılan değer kullanılmaz
user902383

Teşekkürler amir75, yanlışlıkla temin edilen Stringtip. user902383, bu doğru, ancak bir tamsayı değeri için bunun yerine null / boş bir değerin defaultValue kullanmasını tercih ederim.
Brett Ryan

Yanıtlar:


177

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

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

DefaultValue değerini yukarıdaki örnekten kaldırdım, ancak hiç ayarlanmadığı durumlarda istek almayı bekliyorsanız dahil etmek isteyebilirsiniz:

http://example.com/test

6
Sadece bununla ilgili bir güncelleme, ilkbaharın son sürümleri artık boş değerlerin kullanılmasıyla sonuçlanacağı için istenen davranış yayla birlikte eklendiğinden artık boş kontrol gerektirmez.
Brett Ryan

3
Eski yanıtlar, en iyi çözüm @AppLend'den
Jose Pose S

101

İlkel türü varsayılan değeri ayarlayarak koruyabilirsiniz, sizin durumunuzda "required = false" özelliğini eklemeniz yeterlidir :

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

PS Bahar belgelerinin bu sayfası yararlı olabilir: Ek Açıklama Türü RequestParam


1
Teşekkürler ama başlığındaki sorumun ana fikrini kaçırdınız. Boş parametreler sağlama yeteneği istedim /test?i=ve iboş olduğu için varsayılan değere sahip.
Brett Ryan

5
Her neyse, örtülü defaultValueolarak sağlandığındarequired == false
Timur Milovanov

4
Param sağlanmışsa ancak boşsa defaultValueetkili olmaz.
Brett Ryan

12

Int yerine genel sınıf Tamsayı kullanarak RequestParam'ı ayarlayabilirsiniz, bu sorununuzu çözecektir.

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

1

Bunun gibi bir şey de yapabilirsiniz -

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

3
Bir defaultValue'nuz varsa, bunu İsteğe Bağlı yapmanıza gerek yoktur.
Kevin M

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.