@ MequestParam स्प्रिंग एमवीसी में वैकल्पिक मापदंडों को संभालते हुए


185

क्या स्प्रिंग कंट्रोलर के लिए दोनों तरह के अनुरोधों को संभालना संभव है?

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 अनुरोध स्वीकार नहीं किया जाता है।

यदि मैं प्रत्येक अनुरोध को अलग से संभालने के लिए दो नियंत्रकों को परिभाषित करता हूं, तो स्प्रिंग अपवाद के साथ शिकायत करता है "पहले से ही 'नियंत्रक' सेम विधि ... मैप्ड"।


2
इस लेख को पढ़ें: codeflex.co/…
ybonda

जवाबों:


224

आप देने की आवश्यकता required = falseके लिए nameऔर passwordअनुरोध पैरामीटर के रूप में अच्छी तरह से। ऐसा इसलिए है, क्योंकि जब आप सिर्फ logoutपैरामीटर प्रदान करते हैं , तो यह वास्तव में nameऔर passwordसाथ ही वे अभी भी अनिवार्य होने की उम्मीद करते हैं।

यह तब काम किया जब आपने सिर्फ दिया nameऔर passwordक्योंकि पहले से दिए गए logoutधन्यवाद के लिए अनिवार्य पैरामीटर नहीं था ।required = falselogout


167

Spring 4.1.1आगे के भाग के रूप में अब आपके पास जावा 8 Optional( मूल टिकट ) का पूर्ण समर्थन है, इसलिए आपके उदाहरण में दोनों अनुरोध आपके एकल मानचित्रण समापन बिंदु से गुजरेंगे जब तक आप required=falseअपने 3 पैरामेट्स लॉगआउट, नाम, पासवर्ड के लिए वैकल्पिक के साथ प्रतिस्थापित करते हैं:

@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 आप कुछ इस तरह से उपयोग कर सकते हैं: अगर (idOfUser.isPresent ()) {System.out.println ("idOfUser:" + idOfUser.get ()); }
कैसियो सेफिन

10
Intellij चेतावनी: 'Optional <Long>' को पैरामीटर के लिए टाइप के रूप में इस्तेमाल किया जाता है 'requestTimelineStart' कम ... (स्ट्रॉग + F1) निरीक्षण जानकारी: java.util.Optional <T>, java.util.OptionalDouble, जावा के किसी भी उपयोग की रिपोर्ट करता है। use.OptionalInt, java.util.OptionalLong या com.google.common.base.Optional किसी फ़ील्ड या पैरामीटर के प्रकार के रूप में। वैकल्पिक को लाइब्रेरी पद्धति रिटर्न प्रकारों के लिए एक सीमित तंत्र प्रदान करने के लिए डिज़ाइन किया गया था जहां "कोई परिणाम नहीं" का प्रतिनिधित्व करने के लिए एक स्पष्ट तरीका होना चाहिए। वर्ग java.util के साथ फ़ील्ड का उपयोग करना। यदि वर्ग को Serializable होना आवश्यक है, तो java.util.Optional भी समस्याग्रस्त है।
PeMa

जावा 8 मेरा मानना ​​है कि यह नया सही उत्तर होना चाहिए।
जावा-व्यसनी ३१

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और उपयोग करने की कोशिश करेगा जो एक अपवाद देगा जिसमें कोई मानचित्रण नहीं मिल सकता है।
एम। दीनुम

3
बस एक ध्यान दें: सुरक्षा के नजरिए से लॉगआउट को केवल POST अनुरोधों को स्वीकार करना चाहिए, इसलिए 2 तरीके होने चाहिए और फिर उनके URL को समान रखने का कोई मतलब नहीं है।
आरयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.