เป็นไปได้ไหมที่จะมีค่า 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 และพบว่าในความเป็นจริงแล้วพฤติกรรมจะเปลี่ยนค่าว่างเป็นค่าเริ่มต้นโดยไม่ต้องเพิ่ม a NumberFormatExceptionดังนั้น การทำแผนที่เดิมของฉันใช้งานได้ดี

ฉันไม่แน่ใจว่าสปริงนี้มีการเปลี่ยนแปลงพฤติกรรมรุ่นใด


แน่นอนว่าพารามิเตอร์จะเป็นประเภทจำนวนเต็มเพื่อเพิ่มข้อยกเว้นนั้น?
laher

3
ฉันไม่ใช่ผู้เชี่ยวชาญด้านสปริง แต่มีการใช้ค่าเริ่มต้นเมื่อคุณไม่ได้ตั้งค่า? เช่นถ้าคำขอของคุณจะเป็นexample.com/test ? ในขณะที่คุณใช้example.com/test?i=ฉันจะแสดงและตั้งค่าเป็น "" ดังนั้นจึงไม่ใช้ค่าเริ่มต้น
user902383

ขอบคุณ amir75 Stringพิมพ์โดยบังเอิญ user902383 ถูกต้องแม้ว่าสำหรับค่าจำนวนเต็มฉันต้องการให้ค่า null / ว่างใช้ defaultValue แทน
Brett Ryan

คำตอบ:


177

คุณสามารถเปลี่ยนประเภท @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
เพียงแค่การอัปเดตเกี่ยวกับสิ่งนี้เวอร์ชันล่าสุดของ spring ไม่จำเป็นต้องใช้การตรวจสอบ null อีกต่อไปเนื่องจากพฤติกรรมที่ต้องการได้รวมอยู่ใน spring ซึ่งค่าว่างจะส่งผลให้มีการใช้ค่าเริ่มต้น
Brett Ryan

3
คำตอบที่ล้าสมัยทางออกที่ดีที่สุดคือจาก @AppLend
Jose Pose S

101

คุณสามารถคงประเภทดั้งเดิมไว้โดยการตั้งค่าเริ่มต้นในกรณีของคุณเพียงแค่เพิ่มคุณสมบัติ"required = false" :

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

ป.ล. หน้านี้จากเอกสาร Spring อาจมีประโยชน์: Annotation Type RequestParam


1
ขอบคุณ แต่คุณพลาดประเด็นของคำถามของฉันซึ่งอยู่ในชื่อเรื่อง ฉันได้ขอความสามารถในการจัดหาพารามิเตอร์ที่ว่างเปล่า/test?i=และเนื่องจากiค่าว่างมีค่าเริ่มต้น
Brett Ryan

5
อย่างไรก็ตามเมื่อdefaultValueได้รับrequired == falseโดยปริยาย
Timur Milovanov

4
หากระบุพารามิเตอร์ไว้ แต่ว่างเปล่าdefaultValueจะไม่มีผล
Brett Ryan

12

คุณสามารถตั้งค่า RequestParam โดยใช้จำนวนเต็มคลาสทั่วไปแทน int ซึ่งจะช่วยแก้ปัญหาของคุณได้

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

1

คุณสามารถทำสิ่งนี้ได้เช่นกัน -

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

3
หากคุณมีค่า defaultValue ก็ไม่จำเป็นต้องทำให้เป็นตัวเลือก
Kevin M

1

นี่ถือเป็นข้อบกพร่องในปี 2013: https://jira.spring.io/browse/SPR-10180

และได้รับการแก้ไขด้วยเวอร์ชัน 3.2.2 ปัญหาไม่ควรเกิดขึ้นในทุกเวอร์ชันหลังจากนั้นและโค้ดของคุณควรใช้งานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.