वसंत के साथ मैं एक वैकल्पिक पथ चर बना सकता हूं?


186

स्प्रिंग 3.0 के साथ, क्या मेरे पास एक वैकल्पिक पथ चर हो सकता है?

उदाहरण के लिए

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

यहां मैं उसी विधि को पसंद करना /json/abcया /jsonकॉल करना चाहूंगा । अनुरोध पैरामीटर के रूप में
एक स्पष्ट समाधान घोषित type:

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @RequestParam(value = "type", required = false) String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

और फिर /json?type=abc&track=aaया /json?track=rrकाम करेगा

जवाबों:


194

आपके पास वैकल्पिक पथ चर नहीं हो सकते हैं, लेकिन आपके पास दो नियंत्रक विधियाँ हो सकती हैं, जो समान सेवा कोड कहती हैं:

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return getTestBean(type);
}

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testBean(
        HttpServletRequest req,
        @RequestParam("track") String track) {
    return getTestBean();
}

5
@ शमिक: यह मेरी राय में, पथ चर का उपयोग करने के लिए एक सम्मोहक कारण है । दहनशील प्रसार जल्दी से हाथ से निकल सकता है।
स्केफमैन

9
वास्तव में इसलिए नहीं क्योंकि वैकल्पिक घटकों से भरे जाने के दौरान रास्ता उतना जटिल नहीं हो सकता। यदि आपके पास एक या अधिकतम दो वैकल्पिक पथ तत्व हैं, तो आपको मापदंडों का अनुरोध करने के लिए उनमें से कुछ को स्विच करने पर गंभीरता से विचार करना चाहिए।
पैट्रिक कार्नेलिसन

1
और कुछ लोगों के लिए, दूसरा कंट्रोलर मेथड कॉल करने वाला पहला कंट्रोलर मेथड हो सकता है, उदाहरण के लिए, यदि अलग-अलग पैरामीटर को कुछ अन्य माध्यमों द्वारा प्रदान किया जा सकता है
chrismarx

3
कृपया अपने उत्तर को अपडेट करने पर विचार करें, बसंत के नए संस्करण में दो नियंत्रक विधियाँ बनाने के बजाय हम @RequestMappingदो मूल्यों के साथ प्रयोग कर सकते हैं जैसे : stackoverflow.com/questions/17821731/…
csharpfolk

omg आप इन समापन बिंदुओं को बनाए रखने की अपेक्षा कैसे करते हैं? और अगर केवल एक पथ चर के बजाय हमारे पास 5 है, तो मेरे लिए गणित करें, आप कितने समापन बिंदु करेंगे? कृपया मेरा एक काम करते हैं और बदलने के @PathVariableलिए@RequestParam
गुइलहर्मे Alencar

113

आप स्प्रिंग 4.1 और जावा 8 का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं java.util.Optionalजो समर्थित है में @RequestParam, @PathVariable, @RequestHeaderऔर @MatrixVariableवसंत MVC में -

@RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
    @PathVariable Optional<String> type,
    @RequestParam("track") String track) {      
    if (type.isPresent()) {
        //type.get() will return type value
        //corresponds to path "/json/{type}"
    } else {
        //corresponds to path "/json"
    }       
}

आपको यकीन है कि यह काम करेगा? अपने खुद के जवाब यहाँ पता चलता है कि नियंत्रक अगर {प्रकार} पथ से अनुपस्थित है हिट नहीं किया जाएगा। मुझे लगता है कि PathVariable Map एक बेहतर दृष्टिकोण होगा, या अलग नियंत्रकों का उपयोग करेगा।
अंशुल तिवारी

4
हां अगर आपके पास बस है "/json/{type}"और टाइप मौजूद नहीं है तो यह हिट नहीं होगा (जैसा कि मेरा जुड़ा जवाब बताता है) लेकिन यहां आपके पास है value = {"/json/{type}", "/json" }। तो अगर किसी एक कंट्रोलर मेथड को हिट किया जाएगा।
अनिकेत ठाकुर

क्या यह संभव है कि एक ही मूल्य, आदि, प्रकार RequestParam और RequestParam भी होगा?
ज़िगिमेंटस

यह काम करता है, लेकिन वैसे भी नियंत्रक के कार्य को नहीं कहा जाएगा क्योंकि यह वहां एक पैरामीटर की उम्मीद करता है
एलयूएक्सएक्स

15
यह काम करता है, और वसंत 4.3.3 के बाद से, आप @PathVariable(required = false)चर के साथ भी जा सकते हैं और शून्य हो सकते हैं।
निकोलई एहमैन

76

यह अच्छी तरह से ज्ञात नहीं है कि आप @PathVariable एनोटेशन का उपयोग करके पथ चर का मानचित्र भी इंजेक्ट कर सकते हैं। मुझे यकीन नहीं है कि यह सुविधा स्प्रिंग 3.0 में उपलब्ध है या यदि इसे बाद में जोड़ा गया है, लेकिन यहाँ उदाहरण को हल करने का एक और तरीका है:

@RequestMapping(value={ "/json/{type}", "/json" }, method=RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
    @PathVariable Map<String, String> pathVariables,
    @RequestParam("track") String track) {

    if (pathVariables.containsKey("type")) {
        return new TestBean(pathVariables.get("type"));
    } else {
        return new TestBean();
    }
}

1
मैं इसे हर समय उपयोग करता हूं। यह तब काम आता है जब मैं अलग-अलग uri प्रकारों को संभालने के लिए एक एकल विधि चाहता हूं: {"/ json / {type}", "/ json / {type} / {xyz}", "/ json / {type} / {abc} "," / json / {type} / {abc} / {{}}, "/ json"}
Vaibs

25

आप एक का उपयोग कर सकते हैं:

@RequestParam(value="somvalue",required=false)

pathVariable के बजाय वैकल्पिक params के लिए


1
यह संस्करण विशिष्ट है, ऐसा लगता है। स्प्रिंग 3 के लिए कोई भी नहीं जाना चाहिए
स्टु थॉम्पसन

5
वर्तमान में एक स्प्रिंग 3.1 परियोजना के लिए इस पद्धति का उपयोग, और डॉक्स का कहना है कि यह 2.5+ लिए काम करता है, तो यह निश्चित रूप से के लिए स्प्रिंग 3. संपादित काम करता है: स्रोत
इवान बी।

22
सच है, लेकिन यह वह नहीं है जिसके बारे में सवाल है। अनुरोध पैरामीटर का उपयोग वास्तव में "वन स्पष्ट वर्कअराउंड" के रूप में किया गया है , लेकिन प्रश्न स्वयं पथ मापदंडों के बारे में है । यह वैकल्पिक पथ मापदंडों के लिए एक समाधान नहीं है।
अर्जन

9
PathVariable और RequestParam अलग हैं।
टाइमलेस

9

स्प्रिंग 5 / स्प्रिंग बूट 2 उदाहरण:

अवरुद्ध

@GetMapping({"/dto-blocking/{type}", "/dto-blocking"})
public ResponseEntity<Dto> getDtoBlocking(
        @PathVariable(name = "type", required = false) String type) {
    if (StringUtils.isEmpty(type)) {
        type = "default";
    }
    return ResponseEntity.ok().body(dtoBlockingRepo.findByType(type));
}

प्रतिक्रियाशील

@GetMapping({"/dto-reactive/{type}", "/dto-reactive"})
public Mono<ResponseEntity<Dto>> getDtoReactive(
        @PathVariable(name = "type", required = false) String type) {
    if (StringUtils.isEmpty(type)) {
        type = "default";
    }
    return dtoReactiveRepo.findByType(type).map(dto -> ResponseEntity.ok().body(dto));
}

5

निकोलई एहमन की टिप्पणी और वाइल्डलूप के उत्तर का सरल उदाहरण (वसंत 4.3.3+ के साथ काम करता है), मूल रूप से आप इसका उपयोग कर सकते required = falseहैं:

  @RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET)
  public @ResponseBody TestBean testAjax(@PathVariable(required = false) String type) {
    if (type != null) {
      // ...
    }
    return new TestBean();
  }

3

इस स्प्रिंग 3 वेबएमवीसी की जांच करें - वैकल्पिक पथ चर । यह वैकल्पिक पथ चर को सक्षम करने के लिए AntPathMatcher का विस्तार करने का एक लेख दिखाता है और मदद का हो सकता है। लेख पोस्ट करने के लिए सेबस्टियन हेरोल्ड को सभी क्रेडिट ।



-5
$.ajax({
            type : 'GET',
            url : '${pageContext.request.contextPath}/order/lastOrder',
            data : {partyId : partyId, orderId :orderId},
            success : function(data, textStatus, jqXHR) });

@RequestMapping(value = "/lastOrder", method=RequestMethod.GET)
public @ResponseBody OrderBean lastOrderDetail(@RequestParam(value="partyId") Long partyId,@RequestParam(value="orderId",required=false) Long orderId,Model m ) {}

3
आप अपने उत्तर में कुछ पाठ को संपादित करना चाह सकते हैं, यह बताते हुए कि आपको क्यों लगता है कि यह मुद्दे को हल करने में योगदान देता है (4 साल बाद)।
किर्ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.