@RequestParam ใน Spring MVC จัดการพารามิเตอร์ทางเลือก


186

เป็นไปได้ไหมที่สปริงคอนโทรลเลอร์จะจัดการกับคำขอทั้งสองประเภท?

1) http://localhost:8080/submit/id/ID123432?logout=true

2) http://localhost:8080/submit/id/ID123432?name=sam&password=543432

ถ้าฉันกำหนดคอนโทรลเลอร์เดี่ยวของชนิด:

 @RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,   
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout", required = false) String logout,
                              @RequestParam("name") String username,
                              @RequestParam("password") String password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}

คำขอ HTTP ที่มี "logout" ไม่เป็นที่ยอมรับ

ถ้าฉันกำหนดตัวควบคุมสองตัวเพื่อจัดการแต่ละคำขอแยกกันสปริงจะบ่นด้วยข้อยกเว้น "มีวิธีบีน 'ตัวควบคุม' อยู่แล้ว ... แมป"


2
อ่านบทความนี้: codeflex.co/…
ybonda

คำตอบ:


224

คุณจำเป็นต้องให้required = falseสำหรับnameและpasswordคำขอพารามิเตอร์เช่นกัน นั่นเป็นเพราะเมื่อคุณให้logoutพารามิเตอร์เพียงอย่างเดียวก็คาดหวังnameและpasswordเช่นเดียวกับพวกเขาจะยังคงบังคับ

มันทำงานเมื่อคุณเพียงแค่ให้nameและpasswordเพราะlogoutไม่ได้บังคับขอบคุณพารามิเตอร์ที่กำหนดไว้แล้วสำหรับrequired = falselogout


168

ในฐานะที่เป็นส่วนหนึ่งของการSpring 4.1.1เป็นต้นไปขณะนี้คุณมีการสนับสนุนอย่างเต็มที่ของ Java 8 Optional( ตั๋วเดิม ) ดังนั้นในตัวอย่างของคุณร้องขอทั้งสองจะไปผ่านจุดสิ้นสุดของการทำแผนที่ของคุณคนเดียวนานเท่าที่คุณสามารถแทนที่required=falseด้วยตัวเลือกสำหรับ 3 params ของคุณออกจากระบบชื่อรหัสผ่าน:

@RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,   
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout") Optional<String> logout,
                              @RequestParam("name") Optional<String> username,
                              @RequestParam("password") Optional<String> password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}

2
@VibhavChaddha คุณสามารถใช้สิ่งนี้: if (idOfUser.isPresent ()) {System.out.println ("idOfUser:" + idOfUser.get ()); }
Cassio Seffrin

10
คำเตือนของ Intellij: 'ตัวเลือก <ยาว>' ใช้เป็นประเภทพารามิเตอร์ 'ได้รับการร้องขอ TimelineStart' น้อยกว่า ... (Strg + F1) ข้อมูลการตรวจสอบ: รายงานการใช้งานใด ๆ ของ java.util.Optional <T>, java.util.OptionalDouble, java util.OptionalInt, java.util.OptionalLong หรือ com.google.common.base.Optional เป็นประเภทของฟิลด์หรือพารามิเตอร์ ตัวเลือกได้รับการออกแบบมาเพื่อให้กลไกที่ จำกัด สำหรับประเภทการคืนเมธอดของไลบรารีซึ่งจำเป็นต้องมีวิธีที่ชัดเจนในการแสดง "ไม่มีผลลัพธ์" การใช้ฟิลด์ที่มีประเภท java.util.Optional ก็เป็นปัญหาเช่นกันหากคลาสนั้นต้องเป็น Serializable ซึ่ง java.util.Optional
PeMa

นี่ควรเป็นคำตอบที่ถูกต้องใหม่กับ Java 8 ฉันเชื่อว่า
java-addict301

40

สร้าง 2 วิธีที่จัดการเคส คุณสามารถสั่งให้@RequestMappingคำอธิบายประกอบเพื่อพิจารณาพารามิเตอร์บางอย่างขณะทำแผนที่คำขอ ด้วยวิธีนี้คุณสามารถแบ่งได้เป็น 2 วิธี

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                 produces="text/xml", params={"logout"})
public String handleLogout(@PathVariable("id") String id, 
        @RequestParam("logout") String logout) { ... }

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                 produces="text/xml", params={"name", "password"})
public String handleLogin(@PathVariable("id") String id, @RequestParam("name") 
        String username, @RequestParam("password") String password, 
        @ModelAttribute("submitModel") SubmitModel model, BindingResult errors) 
        throws LoginException {...}

1
จะเกิดอะไรขึ้นเมื่อมีคนส่งทั้งชื่อออกจากระบบและรหัสผ่านไปยัง URL แค่อ่านเอกสารมันก็บอกว่า!myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.ต้องลอง
ผู้ถือแหวน

2
มันจะหาคู่ที่ดีที่สุดมันอาจจะลองใช้อันhandleLoginอื่นมันจะให้ข้อยกเว้นที่ระบุว่าไม่พบการแมป
M. Deinum

3
เพียงบันทึกเดียว: จากการล็อกเอาต์ด้านความปลอดภัยควรยอมรับคำขอ POST เท่านั้นดังนั้นควรมี 2 ​​วิธีและไม่เหมาะสมที่จะทำให้ URL เป็นเหมือนเดิม
FlasH จาก Ru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.