java - क्या हमारे पास एक ही आरईएसटी विधि के लिए एक से अधिक @ पाथ एनोटेशन हो सकता है




2 Answers

आपके पास एक विधि पर mutliple @Path एनोटेशन नहीं हो सकते हैं। यह एक "डुप्लिकेट एनोटेशन" वाक्यविन्यास त्रुटि का कारण बनता है।

हालांकि, कई तरीकों से आप विधि में दो पथ प्रभावी ढंग से मानचित्र कर सकते हैं।

@ पैथ एनोटेशन में नियमित अभिव्यक्तियां

जेएक्स-आरएस में @Path एनोटेशन पैरामीटर स्वीकार करता है, जिनके मूल्य नियमित अभिव्यक्तियों का उपयोग करके प्रतिबंधित किया जा सकता है।

यह एनोटेशन:

@Path("a/{parameter: path1|path2}")

दोनों /a/path1 और /a/path2 अनुरोधों से विधि तक पहुंचने में सक्षम होगा। यदि आपको {a:path1\\/subPath1|path2\\/subPath2} साथ काम करने की आवश्यकता है, तो स्लेश से बचें: {a:path1\\/subPath1|path2\\/subPath2}

एक पुनर्निर्देशन स्थिति कोड के साथ प्रतिक्रिया की सेवा

वैकल्पिक रूप से, आप एक पुनर्निर्देशन स्थापित कर सकते हैं। एक अन्य सबसोर्स को परिभाषित करके जर्सी (जेएक्स-आरएस के संदर्भ कार्यान्वयन) में ऐसा करने का एक तरीका यहां दिया गया है। यह सिर्फ एक उदाहरण है, यदि आप पुनर्निर्देशन को संभालने का एक अलग तरीका पसंद करते हैं, तो इसका उपयोग करने में संकोच न करें।

@Path("basepath")
public class YourBaseResource {

  //this gets injected after the class is instantiated by Jersey    
  @Context
  UriInfo uriInfo; 

  @Path("a/b")
  @GET
  public Responce method1(){
    return Response.ok("blah blah").build();
  }

  @Path("a/b/c")
  @GET
  public Response method2(){
    UriBuilder addressBuilder = uriInfo.getBaseUriBuilder();
    addressBuilder.path("a/b");
    return Response.seeOther(addressBuilder.build()).build();
  }

}

URL को फिर से लिखने के लिए एक सर्वलेट फ़िल्टर का उपयोग करना

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

एक अन्य विकल्प यह है कि इसे अपने जावा ऐप के सामने स्थापित प्रॉक्सी के साथ संभालना है। आप अपने जावा कोड को जटिल किए बिना बुनियादी कैशिंग प्रदान करने और नियमों को फिर से लिखने के लिए अपाचे सर्वर सेट अप कर सकते हैं।

क्या हमारे पास एक ही आरईएसटी विधि के लिए एक से अधिक @Path एनोटेशन हो सकता है यानी निष्पादित विधि समान है, लेकिन इसे एक से अधिक यूआरएल तक पहुंचने पर निष्पादित किया गया है?

उदाहरण: मैं http://a/b/c और http://a/b दोनों पर searchNames() विधि को चलाने के लिए चाहता हूं।




आपके विशेष उदाहरण के लिए एक और समाधान:

मान लीजिए कि:

  • /a संसाधन वर्ग के लिए है
  • /b/c और /b विधियों के लिए पथ हैं

क्योंकि एक पूर्ण पथ इस तरह दिखता है:

<protocol><host><port><app><url-pattern><resource-path><method-path>

वैकल्पिक पैरामीटर का प्रयोग करें

@Path("/b{c : (/c)?}")
public Response searchNames(@PathParam("c") String val) {
    ...
}

उपरोक्त उदाहरण सभी उदाहरणों के लिए काम करता है जैसे:

  • /b
  • /b/
  • /b/c
  • /b/c/

लेकिन जब c प्रदान की जाती है, तो val /c (इसमें पहले / पहले होता है)।

यदि आप ऊपर की समस्या को ठीक करना चाहते हैं (जावा पार्सिंग से बचने के लिए), आपको कुछ और जटिल की आवश्यकता है:

@Path("/b{slash : (/)?}{c:((?<=/).*)?}")

जो तीसरे बुलेट बिंदु के लिए केवल c (नहीं /c ) लौटाएगा, लेकिन 4 वें बुलेट बिंदु के लिए यह c/ वापस लौटाएगा जिसे जावा में पार्स किया जाना है।

लेकिन आपके मामले के लिए ( "विधि निष्पादित विधि समान है" ), पार्सिंग के बारे में चिंता न करें क्योंकि आपके पास अलग-अलग कार्य नहीं हैं।




Related

java rest jersey jax-rs