2013-08-27 5 views
13

के साथ ओवरलोड पथ फ़ंक्शंस मैं एक ही जीईटी पथ के लिए कई फ़ंक्शन करना चाहता हूं।विभिन्न @QueryParams

साथ ही मैं अपनी वेब सेवा को इन कार्यों को "ढूंढने" के लिए चाहूंगा यदि केवल और क्वेरी पैरामीटर URL स्ट्रिंग में पैरामीटर से मेल खाते हैं।

उदाहरण के लिए:

मैं Path("/myGET")

और उस पथ के लिए मैं 2 कार्य करना चाहते हैं:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@TypeHint(TagSets.class) 
public Response getTagSets(@QueryParam("entityId") Integer entityId) 
{ 
    ... 
} 

और

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@TypeHint(TagSets.class) 
public Response getTagSets(){ 
    ... 
} 

अभी मैं हूँ त्रुटि प्राप्त हो रही है:

SEVERE: The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Producing media type conflict. The resource methods public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer) and public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer,java.lang.Integer) can produce the same media type SEVERE: Producing media type conflict. The resource methods public javax.ws.rs.core.Response<...>.getTagSets() and public javax.ws.rs.core.Response <...>.getTagSets(java.lang.Integer,java.lang.Integer) can produce the same media type

तो सबसे पहले: वहाँ किसी भी तरह से प्राप्त करने के लिए क्या मैं यहाँ क्या करना चाहते है ..

दूसरा: यदि यह उपलब्ध है, वहाँ किसी भी तरह से है कि एक रास्ता अगर और सिर्फ़ अगर पाया हो जाएगा क्वेरी पैरामीटर फ़ंक्शन में अनुरोध किए गए बिल्कुल मेल खाते हैं? उदाहरण के लिए यदि @QueryParam("differentParam") के साथ एक ही पथ को कॉल किया जाएगा तो यह 2 कार्यों में से किसी तक नहीं पहुंच पाएगा।

तीसरा: यदि जर्सी के साथ ऐसा करने का कोई तरीका नहीं है तो क्या कोई अन्य फ्रेम काम करने का कोई तरीका है?

महत्वपूर्ण: जो लोग इस सवाल का जवाब देते हैं, वे सोचते हैं कि मैं एक समाधान की तलाश में हूं और समाधान नहीं। आज मैं 1 फ़ंक्शन का उपयोग कर रहा हूं और पैरामीटर की जांच कर रहा हूं और मुझे इसकी आवश्यकता है जो मुझे चाहिए (यही वह है जिसे मैंने प्रश्न पोस्ट करने से पहले उपयोग किया था)। लेकिन मैं जो खोज रहा हूं वह शायद मुझे परेशानी बचाने के लिए ढांचे की शक्ति का उपयोग कर रहा है

धन्यवाद।

+0

मैं आपको लगता है, एक भी विधि में ऐसा और प्रोग्राम के क्वेरी पैरामीटर की उपस्थिति पर आधारित कॉल करने के लिए किस अन्य प्रणाली का फैसला करने के लिए होगा । मुझे नहीं लगता कि यह पूरी तरह से क्वेरी पैरा पर आधारित निर्णय लिया जा सकता है। –

+0

सभी उत्तरों मेरे वर्तमान कार्यान्वयन का जिक्र कर रहे हैं। तो मैं आपसे सब कुछ समझता हूं कि जो कुछ मैं जर्सी के साथ ढूंढ रहा हूं उसे करने का कोई तरीका नहीं है ... क्या आपको पता है कि वसंत के साथ ऐसा करने का कोई तरीका है? – Gleeb

+0

आपने अलग-अलग क्वेरी पैरामीटर वाले एक विधि की मांग की, और मेरा जवाब जर्सी का उपयोग कर रहा है। आप वास्तव में क्या ढूंढ रहे हैं? अपने प्रश्न स्पष्ट करें। – anvarik

उत्तर

2

टिप्पणियों में वर्णित एकमात्र तरीका है। आप एक विधि का उपयोग कर सकते हैं जो सभी क्वेरी पैराम घोषित करता है और फिर मानों (अस्तित्व में या नहीं) के आधार पर, सही विधि को कॉल करता है।

(दृष्टिकोण के आसपास कार्य) यदि आप चाहते हैं कि क्लाइंट और कोड कार्यान्वयन के लिए एकाधिक क्वेरी पैरा के साथ एक एकल अंतराल का पर्दाफाश करना कोई फर्क नहीं पड़ता, तो आप इंटरसेप्टर का उपयोग कर सकते हैं। क्वेरी पैरा को पढ़ें और उचित विधि पर निर्देशित करने के लिए यूआरआई को संशोधित करें।

4

एक संसाधन को अपने पथ द्वारा विशिष्ट रूप से परिभाषित किया गया है, न कि इसके पैराम द्वारा। आपके द्वारा परिभाषित दो संसाधनों का एक ही पथ है। आप या तो /myGet/entity, /myGet/, /myGet/differentParam जैसे प्रत्येक के लिए नए पथ परिभाषित कर सकते हैं; या /myGet/ के रूप में एक पथ का उपयोग करें और निम्नलिखित के रूप में क्वेरी पैरामीटर की जाँच करें:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@TypeHint(TagSets.class) 
public Response getTagSets(@Context HttpServletRequest request){ 

     ... 

     if (request.getParameterMap().isEmpty()) { 
      // then you have no query params, implement as there are no query params 
     } else { 
      String queryParam = request.getQueryString(); 
      // check queryParam, and add another if else statements, implement 
     } 

     ... 

} 
+0

देखें तो उत्तर अभी भी वही है। जर्सी के साथ जो कुछ भी करना है, उसे करने का कोई तरीका नहीं है, क्या किसी अन्य ढांचे के साथ ऐसा करने का कोई तरीका है? – Gleeb

+0

मैंने किसी अन्य वेब सेवा ढांचे का उपयोग नहीं किया है, इसलिए उनके बारे में कुछ भी नहीं बता सकता है लेकिन यह वास्तव में दिलचस्प है कि आप एक विधि – anvarik

+0

में कुछ और लाइनों को लागू करने के बजाय पूरी तरह से नए ढांचे पर स्विच करना चाहते हैं, आप निष्कर्षों पर कूद रहे हैं, 1: आपको मेरे वेबएप की मात्रा नहीं है, यह शायद एक पीओसी भी हो सकता है। 2: इस सवाल का एक हिस्सा सीखने के लिए है और न केवल इस समस्या को हल करना है। – Gleeb

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