@ রিকোয়েস্টপ্রামে একটি তালিকা বাঁধাই


126

আমি এই পদ্ধতিতে কোনও ফর্ম থেকে কিছু পরামিতি প্রেরণ করছি:

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

আমি জানি আমি নিয়ামক পদ্ধতিতে সমস্ত প্যারামগুলি এর মতো একটি পরামিতি যুক্ত করে পেতে পারি

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

আমি আমার প্যারামিটারগুলি প্যারামিটারগুলি [] (অন্যান্যগুলি নয়) একটি তালিকা বা অ্যারেতে আবদ্ধ করতে চাই (যে কোনও কিছু যা সূচকের ক্রম বজায় রাখে) তাই আমি একটি বাক্য গঠন দিয়ে চেষ্টা করেছি:

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){
    ....
}

@ মডেলঅ্যাট্রিবিউট হিসাবে একটি তালিকা বৈশিষ্ট্যযুক্ত কোনও অবজেক্ট তৈরি না করেই কোনও তালিকা বা অ্যারেতে কিছু প্যারাম বাঁধতে কোনও বাক্য গঠন আছে কি?

ধন্যবাদ


আমি মনে করি না এটি সম্ভব। কোডটি 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স্টাইলের সূচিযুক্ত পরামিতিগুলি আবদ্ধ করতে হয় তবে আমার ধারণা any @ModelAttributeযাইহোক আপনার প্রয়োজন need


1
অর্ডার নিয়ে সমস্যা হতে পারে (যা আমার ক্ষেত্রে রাখা খুব জরুরি) কারণ আমি একটি ফর্ম সিরিয়াল করে এবং এজ্যাক্স দিয়ে আমি প্রেরণ করে পরামিতিগুলি প্রেরণ করি। আমি "traditionalতিহ্যবাহী" @ মডেলঅ্যাট্রিবিউট উপায়টি ব্যবহার করব।
জাভি

আপনি কি ইউরিটেমপ্লেট বা অন্য কোনও উপায়ে এই ধরণের ম্যাপিংয়ের সাহায্যে একটি ইউআরআই নির্মাণ করবেন তা জানবেন? (এই ধরণের সংস্থানটির ক্লায়েন্টের জন্য)।
ছোমাহ

আমার নিজের প্রশ্নের উত্তর, এটা apears বসন্ত UriTemplate RFC6570 সমর্থন করে না, damnhandy বাস্তবায়ন ব্যবহার করুন: stackoverflow.com/questions/14153036/...
Chomeh

110

অথবা আপনি কেবল এটি করতে পারেন:

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

এটি উদাহরণস্বরূপ এই জাতীয় ফর্মগুলির জন্য কাজ করে:

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

এটি সহজ সমাধান :)


4
যে আদেশ সংরক্ষণ করে?
অ্যান্ড্রু কুক

7
আমি স্প্রিংয়ে 3.0.০ তে [] এর পরিবর্তে কেবল নামটিই ব্যবহার করতে সক্ষম হয়েছি: @ রিকোয়েস্টপ্রাম (মান = "মাইপ্রাম") স্ট্রিং [] মাইপ্যারামস
এম স্মিথ

3
যদিও আমি @ এসএমএসির অনুসন্ধানগুলি ভাগ করি না।
ড্রপ করুন

2
এটির List<String>মাধ্যমে কী পাওয়া সম্ভব ? এছাড়াও জাভা শিমের মতো পাওয়া সম্ভবList<MyBean>
জুজার আলী

3
আমি মনে করি আপনি পরম নাম থেকে বন্ধনীগুলি সরিয়ে ফেলতে পারেন।
theblang

19

ডোনাল ফেলো যা বলেছিল কেবল তার পরিপূরক, আপনি @ রিকোয়েস্টপ্রামের সাথে তালিকা ব্যবহার করতে পারেন

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'

ভাল এটি প্রায় একইভাবে @ মডেলঅ্যাট্রিবিউট ব্যবহার করার মতই, পার্থক্যটি কেবল টীকাযুক্ত নয়। আমি কেবল মডেলএট্রিবিউট এড়াতে চেয়েছিলাম কারণ আমি কোনও মোড়ক তৈরি করতে চাইনি। আমি কোথাও স্ট্যাকওভারফ্লোতে পড়েছি (ঠিক কোথায় তা আমি মনে করতে পারি না) আপনি যদি @ মডেলঅ্যাট্রিবিউট টিকা ছাড়াই নিয়ামক পদ্ধতিতে কোনও প্যারাম যোগ করেন (এবং এটি কোনও HTTPRequest, HTTPResponse এর মতো বিশেষ অবজেক্ট ছিল না ...) ফ্রেমওয়ার্কটি এটি হিসাবে বিবেচনা করে যদি এটি @ মডেলঅ্যাট্রিবিউটের সাথে টিকা দেওয়া থাকে। সুতরাং যদি এটি সত্য হয় তবে এটি ঠিক যেমন @ মডেলঅ্যাট্রিবিউট রয়েছে। তবে আপনার উত্তরের জন্য ধন্যবাদ।
জাভি 19

4

এটি আমার কাছে স্পষ্ট ছিল না যে আপনি অনুরোধের পরম হিসাবে কোনও সংগ্রহকে গ্রহণ করতে পারেন তবে গ্রাহক পক্ষের আপনি এখনও সংগ্রহ আইটেমগুলিকে কমা দ্বারা পৃথক করা মান হিসাবে পাস করতে হবে

উদাহরণস্বরূপ, যদি সার্ভার সাইড এপিআই দেখতে লাগে:

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

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

নীচের মতো একটি অনুরোধপাড়াম হিসাবে সরাসরি রেস্টস্টেম্পলেটে কোনও সংগ্রহে যাওয়ার ফলে ডেটা দুর্নীতি হবে

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

নীচের মতো চেকবক্স টগল সহ লুকানো ক্ষেত্রের মানটি পরিবর্তন করুন ...

এইচটিএমএল:

<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');

    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.