স্প্রিং @ রেসপনসবডি টীকাটি কীভাবে কাজ করে?


91

আমার কাছে একটি পদ্ধতি রয়েছে যা নীচে বর্ণিত হয়:

/**
* Provide a list of all accounts.
*/
//  TODO 02: Complete this method.  Add annotations to respond
//  to GET /accounts and return a List<Account> to be converted.
//  Save your work and restart the server.  You should get JSON results when accessing 
//  http://localhost:8080/rest-ws/app/accounts
@RequestMapping(value="/orders", method=RequestMethod.GET)
public @ResponseBody List<Account> accountSummary() {
    return accountManager.getAllAccounts();
}

সুতরাং আমি জানি যে এই টীকা দ্বারা:

@RequestMapping(value="/orders", method=RequestMethod.GET)

এই পদ্ধতিটি ইউআরএল / আদেশ দ্বারা প্রতিনিধিত্ব করা সংস্থানটিতে জিইটি এইচটিটিপি অনুরোধগুলি পরিচালনা করে ।

এই পদ্ধতিটি একটি ডিএও অবজেক্টকে কল করে যা একটি তালিকা দেয়

যেখানে অ্যাকাউন্ট সিস্টেমে কোনও ব্যবহারকারীর প্রতিনিধিত্ব করে এবং এমন কিছু ক্ষেত্র রয়েছে যা এই ব্যবহারকারীর প্রতিনিধিত্ব করে, এরকম কিছু:

public class Account {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long entityId;

    @Column(name = "NUMBER")
    private String number;

    @Column(name = "NAME")
    private String name;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name = "ACCOUNT_ID")
    private Set<Beneficiary> beneficiaries = new HashSet<Beneficiary>();

    ...............................
    ...............................
    ...............................
}

আমার প্রশ্ন: টিকাটি ঠিক কীভাবে @ResponseBodyকাজ করে?

এটি প্রত্যাবর্তিত List<Account>বস্তুর আগে অবস্থিত তাই আমি মনে করি যে এটি এই তালিকাটিকে বোঝায়। কোর্সের ডকুমেন্টেশনে বলা হয়েছে যে এই টিকাটি ফাংশনটিতে কাজ করে:

ফলাফলটি এইচটিটিপি প্রতিক্রিয়াতে কোনও এইচটিটিপি মেসেজ কনভার্টারের (কোনও এমভিসি ভিউয়ের পরিবর্তে) লিখিত হবে তা নিশ্চিত করুন।

এবং এছাড়াও সরকারী স্প্রিং ডকুমেন্টেশন পড়া: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ResponseBody.html

দেখে মনে হচ্ছে এটি List<Account>বস্তুটি নিয়ে এবং এটিতে রাখে Http Response। এটি কি সঠিক বা আমি ভুল বোঝাবুঝি করছি?

পূর্ববর্তী accountSummary()পদ্ধতির মন্তব্যে লিখিত রয়েছে:

Http: // লোকালহস্ট: 8080 / রেস্ট-ডাব্লু / অ্যাপ্লিকেশন / অ্যাকাউন্টগুলিতে অ্যাক্সেস করার সময় আপনার জেএসএন ফলাফল পাওয়া উচিত

তাহলে এর অর্থ কী? এর অর্থ কি এই যে পদ্ধতিটি List<Account>দ্বারা প্রত্যাবর্তিত বস্তুটি accountSummary()স্বয়ংক্রিয়ভাবে JSONফর্ম্যাটে রূপান্তরিত হয় এবং তারপরে Http Response? অথবা কি?

যদি এই দাবি সত্য হয় তবে এটি কোথায় নির্দিষ্ট করা হবে যে অবজেক্টটি স্বয়ংক্রিয়ভাবে JSONফর্ম্যাটে রূপান্তরিত হবে? @ResponseBodyটীকাগুলি ব্যবহার করার সময় কি স্ট্যান্ডার্ড ফর্ম্যাটটি গৃহীত হয় বা এটি অন্য কোথাও নির্দিষ্ট করা হয়?

উত্তর:


162

প্রথমত, টিকাটি টীকা দেয় না List। এটি যেমন পদ্ধতিটিও বর্ণনা RequestMappingকরে। আপনার কোড সমান

@RequestMapping(value="/orders", method=RequestMethod.GET)
@ResponseBody
public List<Account> accountSummary() {
    return accountManager.getAllAccounts();
}

এখন টীকাটি যা বোঝায় তার অর্থ হ'ল পদ্ধতির প্রত্যাবর্তিত মানটি এইচটিটিপি প্রতিক্রিয়াটির মূল গঠন করবে। অবশ্যই, একটি HTTP প্রতিক্রিয়াতে জাভা অবজেক্টগুলি থাকতে পারে না। সুতরাং অ্যাকাউন্টগুলির এই তালিকাটি REST অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত একটি ফর্ম্যাটে রূপান্তরিত হয়, সাধারণত JSON বা XML।

বিন্যাসের পছন্দ, ইনস্টল বার্তা কনভার্টার উপর নির্ভর করে মান উপর producesঅ্যাট্রিবিউট এর @RequestMappingটীকা এবং বিষয়বস্তুর প্রকার ক্লায়েন্ট গ্রহণ উপর (যে HTTP অনুরোধ হেডার পাওয়া যায়)। উদাহরণস্বরূপ, যদি অনুরোধটি বলে যে এটি এক্সএমএল গ্রহণ করে, তবে জেএসএন নয়, এবং একটি বার্তা রূপান্তরকারী ইনস্টল রয়েছে যা তালিকাকে এক্সএমএলে রূপান্তর করতে পারে, তবে এক্সএমএল ফিরে আসবে।


4
হাই, আমরা কীভাবে "ইনস্টল করা বার্তা রূপান্তরকারী" সেটআপ করব? আমি ডিফল্টটি সবসময় জসনে রূপান্তর করতে চাই। আমি কি তা করতে সক্ষম?
স্যাম ওয়াইসি

@ জেবি নিজেট আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন HTTP প্রতিক্রিয়াতে জাভা অবজেক্ট থাকতে পারে না। আমি জাভা নবী।
নাভেদ আলী

4
@ এরার নাভেদআলি http স্পেসিফিকেশনটি পড়েন, এইচটিপি প্রতিক্রিয়া সামগ্রীর ধরণটি এমন কোনও আইনি বিষয়বস্তু সংজ্ঞায়িত করে যা কোনও HTTP প্রতিক্রিয়া থাকতে পারে। এর জন্য আইনি মানগুলি "অ্যাপ্লিকেশন / অক্টেট-স্ট্রিম", "চিত্র / জেপেইগ", "পাঠ্য / এইচটিএমএল" হতে পারে তবে জাভা অবজেক্টগুলি এর জন্য কোনও আইনি মান নয়।
ZhaoGang

@ জাওগ্যাং, বিষয়বস্তুর ধরণের 'অ্যাপ্লিকেশন / জেসন' আমার পরীক্ষার ক্ষেত্রে 'অ্যাপ্লিকেশন / এক্সএমএল' দ্বারা প্রতিস্থাপন করা হয়েছে, তবে প্রতিক্রিয়া সংস্থায় কোনও পরিবর্তন হয়নি বলে মনে হচ্ছে, এখনও জেসন ফর্ম্যাট উপস্থিত রয়েছে।
লিফিওয়ান

4
ঠিক কোথায়, আমি বলতে চাই কোন বসন্তের ক্লাসে, প্রতিক্রিয়া কীভাবে ফিরে আসবেন তা নির্ধারণ করার সিদ্ধান্ত নেওয়া হয়েছে? আপনি কি আমাকে গিথুব থেকে উত্সকে নির্দেশ করতে পারেন, যেখানে এই সিদ্ধান্ত নেওয়া হয়েছে বা শ্রেণীর নাম? এছাড়াও ক্লায়েন্ট যদি এক্সএমএল গ্রহণ করে তবে কোনও এক্সএমএল রূপান্তরকারী ইনস্টল করা না থাকলে কী হবে?
আনির

68

প্রথম প্রাথমিক জিনিসটি বুঝতে হবে আর্কিটেকচারের পার্থক্য।

এক প্রান্তে আপনার কাছে এমভিসি আর্কিটেকচার রয়েছে যা আপনার সাধারণ ওয়েব অ্যাপের উপর ভিত্তি করে ওয়েব পৃষ্ঠাগুলি ব্যবহার করে এবং ব্রাউজারটি কোনও পৃষ্ঠার জন্য একটি অনুরোধ করে:

Browser <---> Controller <---> Model
               |      |
               +-View-+

ব্রাউজারটি একটি অনুরোধ করে, কন্ট্রোলার (@ নিয়ন্ত্রণকারী) মডেলটি (@ এন্টিটি) পায় এবং মডেল থেকে ভিউ (জেএসপি) তৈরি করে এবং ভিউটি ক্লায়েন্টের কাছে ফিরে আসে। এটি হল বেসিক ওয়েব অ্যাপ্লিকেশন।

অন্য প্রান্তে, আপনার কাছে একটি বিশিষ্ট আর্কিটেকচার রয়েছে। এক্ষেত্রে কোনও দর্শন নেই। কন্ট্রোলার কেবলমাত্র মডেলটিকে (বা রিসোর্স উপস্থাপনা, আরও বিশদ শর্তে) ফেরত পাঠায়। ক্লায়েন্টটি একটি জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন, একটি জাভা সার্ভার অ্যাপ্লিকেশন, যে কোনও অ্যাপ্লিকেশন যাতে আমরা আমাদের REST এপিআইতে প্রকাশ করি। এই আর্কিটেকচারের সাথে ক্লায়েন্ট এই মডেলটির সাথে কী করবেন তা স্থির করে। উদাহরণস্বরূপ টুইটার নিন। ওয়েব (REST) ​​এপিআই হিসাবে টুইটার, যা আমাদের অ্যাপ্লিকেশনগুলিকে স্থিতির আপডেটের মতো জিনিসগুলি পেতে তার এপিআই ব্যবহার করতে দেয়, যাতে আমরা সেই ডেটা আমাদের অ্যাপ্লিকেশনটিতে রাখতে পারি। সেই তথ্যটি JSON এর মতো কিছু ফর্ম্যাটে আসবে।

বলা হচ্ছে, স্প্রিং এমভিসির সাথে কাজ করার সময়, এটি প্রথমে বেসিক ওয়েব অ্যাপ্লিকেশন আর্কিটেকচারটি পরিচালনা করার জন্য নির্মিত হয়েছিল। বিভিন্ন পদ্ধতির স্বাক্ষর স্বাদ থাকতে পারে যা আমাদের পদ্ধতিগুলি থেকে একটি দর্শন তৈরি করার অনুমতি দেয়। পদ্ধতিটি এমন কোনও ModelAndViewজায়গায় ফিরে আসতে পারে যেখানে আমরা স্পষ্টভাবে এটি তৈরি করেছি, বা এমন কিছু অন্তর্নিহিত উপায় রয়েছে যেখানে আমরা কিছু স্বেচ্ছাসেবী বস্তুটি ফিরে যেতে পারি যা মডেল বৈশিষ্ট্যগুলিতে সেট হয়ে যায়। তবে উভয় উপায়েই, অনুরোধ-প্রতিক্রিয়া চক্রের কোথাও কোথাও, সেখানে একটি ভিউ তৈরি করা হবে।

তবে আমরা যখন ব্যবহার করি তখন আমরা @ResponseBodyবলছি যে আমরা তৈরি হওয়া ভিউ চাই না। আমরা কেবল যে ফর্ম্যাটটি নির্দিষ্ট করে তা হিসাবে দেহ হিসাবে রিটার্ন অবজেক্টটি প্রেরণ করতে চাই। আমরা এটি সিরিয়ালযুক্ত জাভা অবজেক্ট (যদিও সম্ভব) হতে চাই না। সুতরাং হ্যাঁ, এটি অন্য কয়েকটি সাধারণ ধরণের রূপান্তরিত হওয়া দরকার (এই ধরণেরটি সাধারণত বিষয়বস্তু আলোচনার মাধ্যমে মোকাবেলা করা হয় - নীচের লিঙ্কটি দেখুন)। সত্যি বলতে, আমি স্প্রিংয়ের সাথে খুব বেশি কাজ করি না, যদিও আমি এখানে এবং সেখানে এটির সাথে ছটফট করি। সাধারণত, আমি ব্যবহার করি

@RequestMapping(..., produces = MediaType.APPLICATION_JSON_VALUE)

সামগ্রীর প্রকার সেট করতে, তবে সম্ভবত জেএসএন ডিফল্ট। আমাকে উদ্ধৃতি দেবেন না, তবে আপনি যদি জেএসওএন পাচ্ছেন এবং আপনি যদি নির্দিষ্ট না করেন producesতবে সম্ভবত এটি ডিফল্ট। JSON একমাত্র ফর্ম্যাট নয়। উদাহরণস্বরূপ, উপরে সহজে XML- এর পাঠানো গেলো, কিন্তু আপনি করতে হবে producesকরতে MediaType.APPLICATION_XML_VALUEএবং আমি আপনাকে কনফিগার করতে বিশ্বাস HttpMessageConverterJAXB জন্য। JSON MappingJacksonHttpMessageConverterকনফিগার করা হিসাবে , যখন আমাদের ক্লাসপাথে জ্যাকসন থাকে।

আমি কিছু সময়ের বিষয়ে জানার জন্য গ্রহণ করা হবে বিষয়বস্তু আলোচনার মাধ্যমে স্থির করা । এটি রেস্টের একটি খুব গুরুত্বপূর্ণ অংশ important এটি আপনাকে বিভিন্ন প্রতিক্রিয়ার ফর্ম্যাটগুলি এবং সেগুলি কীভাবে আপনার পদ্ধতিতে ম্যাপ করতে পারে তা শিখতে সহায়তা করবে।


কীভাবে জেনেরিক / ডায়নামিক আরইএসটি নিয়ন্ত্রণকারী তৈরি করতে হবে তা তদন্ত করার সময় যদি আপনার উত্তর খুঁজে পাওয়া যায় @Controller/@RestController। আমি আবিষ্কার করেছি, যে কোনওভাবে ভিউ রিসলভার স্তরটি বাদ দিতে হবে। এটি এত সহজ নয় কারণ অ্যাবস্ট্রাক্ট কন্ট্রোলার শ্রেণি এমন একটি পদ্ধতি সরবরাহ করে যা অবশ্যই দেখার নামটি ফিরিয়ে আনতে পারে। আমি সে সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করেছি: stackoverflow.com/questions/41016018/… , আমি কীভাবে আমার সমস্যা সমাধান করতে পারি সে সম্পর্কে আপনার কিছু ধারণা থাকলে দয়া করে একটি মন্তব্য পোস্ট করুন।
nowszy94

2

এই আরও, রিটার্ন টাইপ দ্বারা নির্ধারিত হয়

  1. এইচটিটিপি রিকোয়েস্ট যা চায় তা বলছে - এর স্বীকৃতি শিরোনামে। প্রাথমিক অনুরোধটি দেখার চেষ্টা করুন দেখুন কী গ্রহণ করবেন সেট করা আছে।

  2. কি এইচটিপিএমেসেজ কনভার্টরস বসন্ত সেট আপ করে। যদি জ্যাকসন লাইব্রেরিগুলি ক্লাসপথে থাকে তবে স্প্রিং এমভিসি এক্সএমএল (জ্যাকএক্সবি ব্যবহার করে) এবং জেএসএন-র জন্য রূপান্তরকারী সেটআপ করবে।

যদি কোনও পছন্দ থাকে তবে এটি চয়ন করে - উদাহরণস্বরূপ, এটি জেএসএন হতে পারে।

এই হয় অবশ্যই নোট মধ্যে আবৃত। বার্তা রূপান্তরকারী এবং সামগ্রী আলোচনার নোটগুলি সন্ধান করুন।

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