@RequestParam में एक सूची बांधना


126

मैं इस तरह से एक फॉर्म से कुछ पैरामीटर भेज रहा हूं:

myparam[0]     : 'myValue1'
myparam[1]     : 'myValue2'
myparam[2]     : 'myValue3'
otherParam     : 'otherValue'
anotherParam   : 'anotherValue' 
...

मुझे पता है कि मैं नियंत्रक पैरामीटर विधि में सभी पैरामीटर प्राप्त कर सकता हूं जैसे कि एक पैरामीटर

public String controllerMethod(@RequestParam Map<String, String> params){
    ....
}

मैं myParam [] (अन्य लोगों को नहीं) सूची या सरणी (कुछ भी जो सूचकांक क्रम रखता है) को बांधना चाहता हूं, इसलिए मैंने एक वाक्यविन्यास के साथ प्रयास किया है:

public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){
    ....
}

तथा

public String controllerMethod(@RequestParam(value="myParam") String[] myParams){
    ....
}

लेकिन उनमें से कोई भी मायपराम को बांध नहीं रहा है। यहां तक ​​कि जब मैं मानचित्र में एक मान जोड़ता हूं तो यह परमर्स को बांधने में सक्षम नहीं होता है:

public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){
    ....
}

क्या बिना किसी ऑब्जेक्ट को बनाए किसी सूची या सरणी में @ModelAttribute के रूप में सूची विशेषता के साथ कुछ पैरामिक्स को बाँधने के लिए कोई वाक्यविन्यास है?

धन्यवाद


मुझे नहीं लगता कि यह संभव है। HandlerMethodInvoker.resolveRequestParamकेवल कभी भी कोड को पहला मूल्य मिलता है
स्केफमैन

6
( स्प्रिंग बूट ): के बारे में है method = RequestMethod.GETया method = RequestMethod.POST? यदि सफलतापूर्वक ( स्प्रिंग बूट ) .GET @RequestParam List<String> groupValसे पूरा हुआ?groupVal=kkk,ccc,mmm
तुलसी

जवाबों:


76

सरणियों में @RequestParamएक ही नाम के कई मापदंडों बंधन के लिए उपयोग किया जाता है:

myparam=myValue1&myparam=myValue2&myparam=myValue3

यदि आपको @ModelAttribute-स्टाइल अनुक्रमित मापदंडों को बाँधने की आवश्यकता है , तो मुझे लगता है कि आपको किसी @ModelAttributeभी तरह की आवश्यकता है।


1
आदेश के साथ समस्याएं हो सकती हैं (जो मेरे मामले में रखना बहुत महत्वपूर्ण है) क्योंकि मैं एक फॉर्म को क्रमबद्ध करके और मुझे अजाक्स के साथ भेजकर पैरामीटर भेजता हूं। मैं "पारंपरिक" @ModelAttribute तरीके का उपयोग करूँगा।
जावी

क्या आप जानते हैं कि UriTemplate, या कुछ अन्य साधनों के साथ इस तरह की मैपिंग के साथ URI का निर्माण कैसे किया जा सकता है? (इस प्रकार के संसाधन के ग्राहक के लिए)।
चौदह

मेरे स्वयं के प्रश्न का उत्तर देते हुए, यह माफी मांगता है कि वसंत UriTemplate RFC6570 का समर्थन नहीं करता है, दमघोंटू कार्यान्वयन का उपयोग करें: stackoverflow.com/questions/14153036/…
6

110

या आप इसे इस तरह से कर सकते हैं:

public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
    ....
}

उदाहरण के लिए इस तरह काम करता है:

<input type="checkbox" name="myParam[]" value="myVal1" />
<input type="checkbox" name="myParam[]" value="myVal2" />

यह सबसे सरल उपाय है :)


4
आदेश को संरक्षित करता है?
andrew cooke

7
मैं स्प्रिंग 3.0 में [] के बजाय सिर्फ नाम का उपयोग करने में सक्षम था: @RequestParam (मान = "myParam") स्ट्रिंग [] myParams
एम स्मिथ

3
मैं हालांकि, @mmith के निष्कर्षों को साझा नहीं करता।
ड्रॉप

2
क्या इसके List<String>माध्यम से प्राप्त करना संभव है । इसके अलावा एक जावा बीन प्राप्त करना संभव है जैसेList<MyBean>
जूजर अली

3
मुझे लगता है कि आप ब्रैकेट को परम नाम से हटा सकते हैं।
दिबांग

19

डोनल फेलो ने जो कहा है, उसे पूरक करते हुए, आप @RequestParam के साथ सूची का उपयोग कर सकते हैं

public String controllerMethod(@RequestParam(value="myParam") List<ObjectToParse> myParam){
....
}

आशा करता हूँ की ये काम करेगा!


12

तुलसी ने इस प्रश्न का उल्लेख करते हुए कहा कि यदि method = RequestMethod.GETआप उपयोग कर सकते हैं @RequestParam List<String> groupVal

फिर परम की सूची के साथ सेवा को कॉल करना उतना ही सरल है:

API_URL?groupVal=kkk,ccc,mmm

11

एक तरीका है कि आप इसे पूरा कर सकते हैं (एक हैक तरीके से) के लिए एक आवरण वर्ग बनाने के लिए है List। ऐशे ही:

class ListWrapper {
     List<String> myList; 
     // getters and setters
}

तब आपका नियंत्रक विधि हस्ताक्षर इस तरह दिखेगा:

public String controllerMethod(ListWrapper wrapper) {
    ....
}

उपयोग करने के लिए कोई ज़रूरत नहीं @RequestParamहै या @ModelAttributeयदि संग्रह नाम आप अनुरोध में पारित, आवरण वर्ग के संग्रह क्षेत्र नाम से मेल खाता मेरी उदाहरण में आपके अनुरोध पैरामीटर इस तरह दिखना चाहिए एनोटेशन:

myList[0]     : 'myValue1'
myList[1]     : 'myValue2'
myList[2]     : 'myValue3'
otherParam    : 'otherValue'
anotherParam  : 'anotherValue'

वैसे यह @ModelAttribute का उपयोग करने के लगभग समान है, केवल अंतर यह है कि परम एनोटेट नहीं है। मैं @ModelAttribute से बचना चाहता था क्योंकि मैं एक रैपर नहीं बनाना चाहता था। मैं स्टैकओवरफ़्लो में कहीं पढ़ता हूं (मुझे ठीक से याद नहीं है कि कहां है) कि अगर आप @ModelAttribute एनोटेशन के बिना नियंत्रक विधि में एक परम जोड़ते हैं (और यह HttpRequest, HttpResponse ...) की तरह एक विशेष वस्तु नहीं थी, तो फ्रेमवर्क इसे मानते हैं। अगर यह @ModelAttribute के साथ एनोटेट किया गया था। तो अगर यह सच था तो यह बिल्कुल @ModelAttribute होने जैसा है। लेकिन आपके उत्तर के लिए धन्यवाद।
जावी

4

मेरे लिए यह स्पष्ट नहीं था कि यद्यपि आप अनुरोध परम के रूप में एक संग्रह को स्वीकार कर सकते हैं, लेकिन उपभोक्ता पक्ष पर आपको अभी भी संग्रह वस्तुओं में अल्पविराम द्वारा अलग किए गए मानों के रूप में पारित करना होगा

उदाहरण के लिए यदि सर्वर साइड एपीआई इस तरह दिखता है:

@PostMapping("/post-topics")
public void handleSubscriptions(@RequestParam("topics") Collection<String> topicStrings) {

    topicStrings.forEach(topic -> System.out.println(topic));
}

नीचे दिए गए अनुरोध के रूप में RestTemplate के संग्रह में सीधे पास होने से डेटा भ्रष्टाचार होगा

public void subscribeToTopics() {

    List<String> topics = Arrays.asList("first-topic", "second-topic", "third-topic");

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForEntity(
            "http://localhost:8088/post-topics?topics={topics}",
            null,
            ResponseEntity.class,
            topics);
}

इसके बजाय आप उपयोग कर सकते हैं

public void subscribeToTopics() {

    List<String> topicStrings = Arrays.asList("first-topic", "second-topic", "third-topic");
    String topics = String.join(",",topicStrings);

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForEntity(
            "http://localhost:8088/post-topics?topics={topics}",
            null,
            ResponseEntity.class,
            topics);
}

पूरा उदाहरण यहां पाया जा सकता है , आशा है कि यह किसी को सिरदर्द से बचाता है :)


-7

नीचे की तरह चेकबॉक्स टॉगल के साथ छिपा हुआ फ़ील्ड मान बदलें ...

HTML:

<input type='hidden' value='Unchecked' id="deleteAll" name='anyName'>
<input type="checkbox"  onclick="toggle(this)"/> Delete All

स्क्रिप्ट:

function toggle(obj) {`var $input = $(obj);
    if ($input.prop('checked')) {

    $('#deleteAll').attr( 'value','Checked');

    } else {

    $('#deleteAll').attr( 'value','Unchecked');

    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.