বসন্ত: আমি কীভাবে একটি অনুরোধ-বিছানো শিমের মধ্যে একটি এইচটিটিপি সার্লেট রেকুয়েস্ট ইনজেক্ট করব?


96

আমি বসন্তে একটি অনুরোধ-বিস্তৃত শিম সেট করার চেষ্টা করছি ।

আমি সফলভাবে এটি সেট আপ করেছি যাতে অনুরোধ অনুযায়ী শিম একবার তৈরি হয়। এখন, এটির জন্য HttpServletRequest অবজেক্টটি অ্যাক্সেস করা দরকার।

যেহেতু বিন প্রতি অনুরোধে একবার তৈরি করা হয়েছে, তাই আমি ধারণা করি যে ধারকটি সহজেই আমার বিনের অনুরোধের বস্তুকে ইনজেক্ট করতে পারে। আমি এটা কিভাবে করবো ?

উত্তর:


117

অনুরোধ বস্তুর সাথে অনুরোধ-স্কোপ করা মটরশুটিটি স্বয়ংক্রিয়ভাবে চালিত হতে পারে।

private @Autowired HttpServletRequest request;

4
এর জন্য কি কোনও পুরানো ধাঁচের এক্সএমএল উপায় আছে?
চেরুভিম

4
আমার জন্য কাজ করে না (বসন্তের এমভিসি 3.1) - সম্ভবত আরও কিছু করার দরকার আছে যা? সামিতের সমাধান নিয়ে যাচ্ছি।
kldavis4

4
সমস্যাটি হ'ল আপনি যখন মকএমভিসি এবং এই জাতীয় ইনজেকশন ব্যবহার করে ভ্যালিডেটর পরীক্ষা করেন তখন আপনার সমস্যা হবে। এই ক্ষেত্রে অন্য সমাধানটিকেই অগ্রাধিকার দেওয়া হবে
Neyko

21
এইচটিটিএস সার্লেট রিকোয়েস্টকে অ-অনুরোধ-বাদিত মটরশুটিগুলিতেও স্বাবলম্বন করা সম্ভব, কারণ এইচটিটিএস সার্লেট রেকোয়েস্টের জন্য একটি প্রক্সি এইচটিটিপি সার্ভেলেকুইয়েস্ট উত্পন্ন করবে যা অনুরোধের প্রকৃত উদাহরণটি পেতে কীভাবে সচেতন। সুতরাং আপনার কন্ট্রোলার সিঙ্গলটন বাদে থাকলেও অনুরোধটির স্বাক্ষর করা নিরাপদ।
ভোর

4
স্প্রিংয়ের জন্য সতর্কতা <= 3.1 ব্যবহারকারীরা স্বতঃশক্তি চলমান পরীক্ষাগুলিতে কাজ করবে না।
রুবেন্স মারিজুজ্জো

140

স্প্রিং প্রকারের মোড়কের বস্তুর মাধ্যমে বর্তমান HttpServletRequestঅবজেক্টটি (পাশাপাশি বর্তমান HttpSessionবস্তুটি) প্রকাশ করে । এই মোড়কের জিনিসটি থ্রেডলোকালের সাথে আবদ্ধ এবং পদ্ধতিটি কল করে প্রাপ্ত হয় ।ServletRequestAttributesstaticRequestContextHolder.currentRequestAttributes()

ServletRequestAttributesপদ্ধতি প্রদান করে getRequest()বর্তমান অনুরোধ পেতে, getSession()বর্তমান সেশন এবং অন্যান্য পদ্ধতি উভয় সুযোগ সঞ্চিত বৈশিষ্ট্যাবলী পেতে পেতে। নিম্নলিখিত কোডটি কিছুটা কুৎসিত হলেও, অ্যাপ্লিকেশনের যে কোনও জায়গায় আপনার বর্তমান অনুরোধের বস্তুটি পাওয়া উচিত:

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();

নোট করুন যে RequestContextHolder.currentRequestAttributes()পদ্ধতিটি একটি ইন্টারফেস দেয় এবং ইন্টারফেস ServletRequestAttributesপ্রয়োগ করে এমনটি টাইপকাস্ট করা দরকার ।


স্প্রিং জাভাদোক : রিকোয়েস্টকন্টেক্সটহোল্ডার | সার্লেটলেকুয়েস্ট্যাট্রিবিউটস


8
ইনজেকশনটি ভাল রেজোলিউশন, তবে আমি মকএমভিসি টেস্টিং স্প্রিং ভ্যালিডেটরগুলির সাথে সমস্যা পেয়েছি যা এইচটিটিপি সার্ভলেটরেক্সেস্ট ইনজেক্ট করে। সুতরাং আপনি যদি উভয় মক টেস্ট এবং প্রডাকশন কোড সঠিকভাবে চলমান চান তবে এটি পছন্দ হওয়া উচিত।
নেইকো

@ নাইকো কেন এটি? মক টেস্টের জন্য (ইউনিট টেস্ট?), আপনি মক এইচটিটিপি সার্লেট রেকোয়েস্ট বা যা খুশি ইনজেকশন দিতে পারেন .. তাই না? বা আপনি কী অনুমান করে মক এইচটিএইচপিএস সার্লেটের অনুরোধটি ব্যবহার করতে পারেন?

এটি কি একক-স্কোপড পরিষেবা দৃষ্টান্তে ব্যবহার করা নিরাপদ?
জিন কোওন

2

এখানে প্রস্তাবিত হিসাবে আপনি HttpServletRequestপদ্ধতি প্যারাম হিসাবে ইনজেক্ট করতে পারেন , উদাহরণস্বরূপ:

public MyResponseObject myApiMethod(HttpServletRequest request, ...) {
    ...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.