2015-11-14 8 views
6

के लिए एक सामान्य पथ कैसे सेट करें I api लिखने के लिए वसंत बूट का उपयोग कर रहा हूं और मैं अपने सभी संसाधनों को एक सामान्य आधार पथ (/ इस मामले में एपीआई) के पीछे मैप करना चाहता हूं। हालांकि मैं ऐसा करने के लिए प्रत्येक RestController क्लास को एनोटेट नहीं करना चाहता (उदाहरण के लिए @RequestMapping के साथ इसे एनोटेट करके)। मैं निम्नलिखित समाधान के बारे में सोचा है लेकिन वे सभी एक नीचे की ओर है कि मैं नहीं बल्कि नहीं चाहता है:स्प्रिंग बूट: एकाधिक रेस्टकंट्रोलर

  • एक आधार वर्ग (ApiRestController जैसे) बनाया जा रहा है और अन्य सभी RestController यह एक वारिस हो रही है। यह नुकसान के रूप में है कि वर्ग स्तर पर @Requestmapping आधार और कार्यान्वयन कक्षाओं के बीच विलय नहीं किया गया है।
  • सभी रेस्टकंट्रोलर को एनोटेट करना लेकिन इससे कोड डुप्लिकेशन
  • सर्वर.कॉन्क्स्ट-पथ गुण बदल रहा है। यह नुकसान के रूप में है कि सभी अंतराल इस आधार पथ का उपयोग करेंगे। यहां तक ​​कि actuator परियोजना द्वारा खुला अंत बिंदु भी।
  • एक कस्टम डिस्पैचर सर्विलेट और सर्वलेट पंजीकरण बीन का उपयोग करना। लेकिन ऐसा लगता है कि server.context-path को बदलने के समान प्रभाव पड़ता है।

तो क्या किसी को पता है कि समाधान के नुकसान के बिना इसे कैसे किया जाए। परियोजना केवल एक आरईएसटी आधारित बैकएंड का पर्दाफाश करेगी और किसी भी स्थिर सामग्री को सर्वर नहीं करेगी (यह नहीं पता कि यह संभावित समाधानों को प्रभावित करता है)। Restcontrollers भी कई पैकेजों पर विभाजित हैं।

धन्यवाद।

+0

यदि मैं सही ढंग से समझ गया, तो इस सुविधा के बारे में स्प्रिंग पर एक समस्या है: https://jira.spring.io/browse/SPR-16336 – Dherik

उत्तर

3

आप सभी RestControllers पर @RequestMapping ("/ api") क्यों नहीं डालते?

@RestController 
@RequestMapping("/api") 
public class UserApi { 
    @RequestMapping("/user") 
    public String user() { 
     ... 
    } 
} 
+2

यदि संभव हो तो मैं इस कोड डुप्लिकेशंस से बचना चाहता हूं (बहुत DRY होने के नाते;)), –

+0

भूलने में हमेशा एक बदलाव होता है यदि आप भूल जाते हैं, तो आपको एक त्रुटि मिलती है और यह पर्याप्त है। पुर्तगाली में हमारे पास इसके लिए एक शब्द है, "preciosismo"। –

+0

यह सभी नियंत्रकों के लिए सामान्य संदर्भ पथ नहीं जोड़ रहा है, यह प्रत्येक नियंत्रक को अलग से जोड़ रहा है। –

1

आप जो भी शामिल होगा @RestController और @RequestMapping अपने कस्टम एनोटेशन बनाने की कोशिश कर सकते हैं:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@RestConntroller 
@RequestMapping(value = "/api") 
@interface MyController { 

} 
+0

मुझे लगता है कि अगर मैं इस एनोटेशन को कक्षा में और "@ रेक्यूमैपिंग" पर डालता हूं (उदाहरण के लिए उस वर्ग के सभी संसाधन पथ/एपीआई/उपयोगकर्ता के अंतर्गत हैं), तो दो "@RequestMapping" एनोटेशन नहीं होंगे विलय नहीं किया जाएगा, या मैं इस में गलत हूँ? –

+0

यदि आप एक कक्षा में एक एनोटेशन डालते हैं और दूसरे को विधि पर रखा जाता है, तो उन्हें विलय किया जाना चाहिए। – jny