2011-05-27 9 views
36

में एकाधिक क्वेरी पैरामीटर हैंडलिंग वेब सेवा में मैं पर काम कर रहा हूँ, मैं क्वेरी पैरामीटर जो /stats?store=A&store=B&item=C&item=Dजर्सी

की तरह लग इसे नीचे तोड़ने के लिए के साथ एक यूआरआई लागू करने की आवश्यकता है, मैं क्वेरी पैरामीटर का उपयोग करने में सक्षम होना चाहिए उन स्टोरों से एकाधिक/सभी वस्तुओं के लिए एकाधिक/सभी स्टोर्स और डेटा से डेटा निर्दिष्ट करने के लिए। अब तक मैं आइटम क्वेरी खींचने के लिए एक प्रश्न तर्क को ठीक करने में सक्षम हूं, लेकिन मैं अधिक प्रश्नों को कार्यान्वित करने के लिए खो गया हूं, और ऐसा लगता है कि मैंने कौन से संसाधनों को देखा था इस कार्यान्वयन के साथ।

मुझे अपने विधि में अब तक है

@GET 
@Path("stats") 
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item) 
{ 
    /**Run data using item as variable**/ 
    return someStringOfData 
} 

की तर्ज जो एक आइटम के लिए अच्छी तरह से काम करता है, और सभी डेटा वापस अगर मैं यूआरआई में पैरामीटर टाइप न करें होगा साथ है। हालांकि, मुझे यकीन है कि इससे कहीं अधिक पैरामीटर कैसे संभालें।

अद्यतन:

मैं पता लगा है बस इतना की तरह विधि करने के लिए एक दूसरा तर्क जोड़कर 2 विभिन्न मापदंडों का उपयोग कैसे करें:

public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store, 
    @DefaultValue("All") @QueryParam(value = "item") final String item) 

सवाल यह है कि एक से अधिक मान लागू करने के लिए की बनी हुई है एक ही पैरामीटर के।

+1

आप लिखकर अपने कोड को सरल बना सकते हैं: @QueryParam ("store") – Vincent

उत्तर

71

यदि आप से String से List<String> पर संग्रह पैरामीटर के प्रकार को बदलते हैं, तो आपको एक संग्रह प्राप्त करना चाहिए जिसमें आपके द्वारा देखे जा रहे सभी मूल्य हैं।

निम्नलिखित प्रकार समर्थित हैं:
  1. आदिम प्रकार
  2. प्रकार एक निर्माता है कि स्वीकार करता है कि

    @GET 
    @Path("/foo") 
    @Produces("text/plain") 
    public String methodImCalling(@DefaultValue("All") 
               @QueryParam(value = "item") 
               final List<String> item) { 
        return "values are " + item; 
    } 
    

    JAX-आरएस विनिर्देश (खंड 3.2) @QueryParam एनोटेशन के बारे में निम्नलिखित का कहना है एक एकल String तर्क।

  3. ऐसे प्रकार जिनके पास valueOf नामक एक स्थिर विधि है, जो एक String तर्क के साथ है।
  4. List<T>, Set<T>, या SortedSet<T> जहां T ऊपर 2 या 3 संतुष्ट करता है।
+0

परिभाषित सूची काम नहीं करती है, हालांकि। मुझे लगता है कि ArrayList एक ही उद्देश्य की सेवा करेगा? – ZKSteffel

+0

'सूची आइटम' काम नहीं किया, और 'ArrayList आइटम' ने अभी अपना कोड तोड़ दिया ... कोई अन्य सुझाव? – ZKSteffel

+0

@ZKSteffel: यह सुनिश्चित नहीं है कि यह क्यों काम नहीं करेगा क्योंकि मैंने त्वरित परीक्षण किया था और यह मेरे लिए काम करता था। मैं जिस पूर्ण विधि का उपयोग करता हूं उसे दिखाने के लिए मैं अपना उत्तर संपादित करूंगा। क्या आप मुझे असफल होने के बारे में अधिक जानकारी दे सकते हैं? – stand

10

List<String> items=ui.getQueryParameters().get("item");

जहां ui तो जैसे बाकी संसाधन में एक सदस्य के रूप में घोषित किया गया है:

@Context UriInfo ui; 

नकारात्मक पक्ष यह है कि यह सब पर तरीकों तर्क में प्रकट नहीं होता है।

+1

हालांकि इस पोस्टर ने गलत सवाल का जवाब दिया था, लेकिन यह सवाल था कि मैंने गुमराह किया था इसलिए मुझे इसे ऊपर उठाना पड़ा क्योंकि इससे मुझे मदद मिली। @ टाल धन्यवाद। – JSager

2

अक्षीय जेएस जैसे कुछ libs बहु-मूल्य param अनुरोध भेजते समय स्क्वायर ब्रैकेट नोटेशन का उपयोग करते हैं:/आँकड़े?स्टोर [] = एक & दुकान [] = बी & आइटम [] = सी & आइटम [] = डी

(के साथ या वर्ग कोष्ठक के बिना) उन सभी मामलों को संभालने के लिए आप इस तरह एक और परम जोड़ सकते हैं:

public String methodImCalling(
    @QueryParam(value = "store") final List<String> store, 
    @QueryParam(value = "store[]") final List<String> storeWithBrackets, 
    @QueryParam(value = "item") final List<String> item, 
    @QueryParam(value = "item[]") final List<String> itemWithBrackets) { 
... 
} 

शून्य के लिए जांच करने वाले प्रत्येक तर्क का निरीक्षण करना।

संबंधित मुद्दे