আমি স্প্রিং ৩.২.x ব্যবহার করে কীভাবে একটি আরএসটি এপিআই সংস্করণ পরিচালনা করব তা অনুসন্ধান করেছি, তবে বজায় রাখা সহজ এমন কিছুই আমি পাইনি। আমি প্রথমে আমার সমস্যাটি এবং তারপরে একটি সমাধান ব্যাখ্যা করব ... তবে আমি ভাবছি যে আমি এখানে চাকাটি পুনরায় উদ্ভাবন করছি কিনা।
আমি গ্রহণ শিরোনামের উপর ভিত্তি করে সংস্করণটি পরিচালনা করতে চাই এবং উদাহরণস্বরূপ যদি কোনও অনুরোধের কাছে গ্রহণ শিরোনাম থাকে তবে application/vnd.company.app-1.1+jsonআমি চাই যে বসন্তের এমভিসি এই সংস্করণটি পরিচালনা করে এমন পদ্ধতিতে এটি ফরোয়ার্ড করে। এবং যেহেতু কোনও এপিআইতে সমস্ত পদ্ধতি একই রিলিজে পরিবর্তিত হয় না, তাই আমি আমার প্রতিটি কন্ট্রোলারের কাছে যেতে এবং কোনও হ্যান্ডলারের জন্য কোনও সংস্করণ পরিবর্তন করতে চাই না যা সংস্করণগুলির মধ্যে পরিবর্তিত হয়নি। স্প্রিং ইতিমধ্যে কোন পদ্ধতিটি কল করতে হবে তা আবিষ্কার করেছে বলে নিজেরাই কন্ট্রোলারে (পরিষেবা লোকের ব্যবহার করে) কোন সংস্করণটি ব্যবহার করা হবে তা নির্ধারণ করার যুক্তিও রাখতে চাই না।
সুতরাং সংস্করণ 1.0, 1.8 তে একটি এপিআই নিয়েছে যেখানে হ্যান্ডলারটি 1.0 সংস্করণে প্রবর্তিত হয়েছিল এবং v1.7 এ পরিবর্তিত হয়েছে, আমি এটি নিম্নলিখিত পদ্ধতিতে পরিচালনা করতে চাই। কল্পনা করুন যে কোডটি একটি নিয়ামকের ভিতরে রয়েছে এবং এমন একটি কোড রয়েছে যা শিরোলেখ থেকে সংস্করণটি বের করতে সক্ষম। (নিম্নলিখিতটি বসন্তে অবৈধ)
@RequestMapping(...)
@VersionRange(1.0,1.6)
@ResponseBody
public Object method1() {
// so something
return object;
}
@RequestMapping(...) //same Request mapping annotation
@VersionRange(1.7)
@ResponseBody
public Object method2() {
// so something
return object;
}
বসন্তে এটি সম্ভব নয় কারণ 2 টি পদ্ধতির একই RequestMappingটীকা থাকে এবং স্প্রিং লোড হতে ব্যর্থ হয়। ধারণাটি হ'ল VersionRangeটীকাটি একটি মুক্ত বা বন্ধ সংস্করণ পরিসরটি সংজ্ঞায়িত করতে পারে। প্রথম পদ্ধতিটি 1.0 থেকে 1.6 সংস্করণগুলির মধ্যে বৈধ, অন্যদিকে 1.7 সংস্করণটির জন্য (সর্বশেষতম সংস্করণ 1.8 সহ)। আমি জানি যে কেউ যদি 99.99 সংস্করণটি পাস করার সিদ্ধান্ত নেয় তবে এই পদ্ধতির ব্যত্যয় ঘটেছে, তবে এটির সাথে আমি বেঁচে আছি ঠিক।
এখন, যেহেতু উপরের অংশে বসন্ত কীভাবে কাজ করে তার গুরুতর পুনরায় কাজ করা সম্ভব নয়, তাই হ্যান্ডলাররা যেভাবে অনুরোধগুলির সাথে মিলেছে, বিশেষত আমার নিজের লেখার জন্য ProducesRequestConditionএবং সেখানে সংস্করণটির সীমা রয়েছে তার সাথে আমি টিংগার করার কথা ভাবছিলাম । উদাহরণ স্বরূপ
কোড:
@RequestMapping(..., produces = "application/vnd.company.app-[1.0-1.6]+json)
@ResponseBody
public Object method1() {
// so something
return object;
}
@RequestMapping(..., produces = "application/vnd.company.app-[1.7-]+json)
@ResponseBody
public Object method2() {
// so something
return object;
}
এইভাবে, আমি টীকাগুলির উত্পাদনের অংশে সংজ্ঞায়িত বা উন্মুক্ত সংস্করণ রেঞ্জ রাখতে পারি। আমি এই সমাধানটিতে এখনই কাজ করছি, যে সমস্যাটি এখনও আমার এখনও পছন্দ হয়নি এমন কয়েকটি মূল স্প্রিং এমভিসি ক্লাস ( RequestMappingInfoHandlerMapping, RequestMappingHandlerMappingএবং RequestMappingInfo) প্রতিস্থাপন করতে হয়েছিল , কারণ এটি যখনই নতুন সংস্করণে আপগ্রেড করার সিদ্ধান্ত নেয় তখন অতিরিক্ত কাজ করা হয় means বসন্ত।
আমি যে কোনও ধারণার প্রশংসা করব ... এবং বিশেষত, সরল, সহজ উপায় বজায় রাখার জন্য এটি করার কোনও পরামর্শ
সম্পাদন করা
একটি অনুগ্রহ যোগ করা। অনুগ্রহ পেতে, দয়া করে নিজেরাই নিয়ন্ত্রকের মধ্যে এই যুক্তি না রাখার পরামর্শ দিয়ে উপরের প্রশ্নের উত্তর দিন। কোন নিয়ামক পদ্ধতিটি কল করতে হবে তা নির্বাচন করার জন্য বসন্তের ইতিমধ্যে প্রচুর যুক্তি রয়েছে এবং আমি এটিতে পিগিব্যাক করতে চাই।
সম্পাদনা 2
আমি গিথুবে মূল POC (কিছু উন্নতির সাথে) ভাগ করেছি: https://github.com/augusto/restVersioning
produces={"application/json-1.0", "application/json-1.1"}ইত্যাদি

