স্প্রিং এমভিসি কন্ট্রোলার পদ্ধতিতে মানটি না ফেরলে কী ফিরবে?


135

আমি $.getJSON()আমার সহজ স্প্রিং এমভিসি ব্যাকএন্ডে অ্যাসিঙ্ক্রোনাস কল করতে jQuery এর ব্যবহার করছি । বেশিরভাগ স্প্রিং কন্ট্রোলার পদ্ধতিতে এ জাতীয় চেহারা:

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
    @RequestParam("type") String type) {
    return someDAO.getSomeData(widget, type);
}   

আমার জিনিসগুলি সেট আপ করা হয়েছে যাতে প্রতিটি নিয়ামক জেএসএন @ResponseBodyহিসাবে ফেরত দেয় যা ক্লায়েন্টের পক্ষের প্রত্যাশা।

কিন্তু যখন কোনও অনুরোধ ক্লায়েন্ট-সাইডে কোনও সামগ্রী ফেরত পাঠানোর কথা না হয় তখন কী ঘটে? আমি কি রাখতে পারি:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

যদি তা না হয় তবে এখানে ব্যবহারের উপযুক্ত সিনট্যাক্স কী?


আমি ধরে নিলাম আপনি যদি কিছু ফেরত না দেন তবে কোনও সামগ্রী ফেরত পাঠানো হবে না?
আরহান্ত

1
আমি মনে করি আমি এখনও কোনও ধরণের একটি পজো ফিরিয়ে আনতে পারি, যদিও আপনার সমাধানের সংস্করণ 1 এ এটি কেবল "সাফল্য" বুলিয়ান বা অনুরূপ কিছু আবৃত করে। তারপর আপনি আপনার সব AJAX এর পদ্ধতি একটি সামঞ্জস্যপূর্ণ প্যাটার্ন, এবং কিছু যখন এটি সক্রিয় আউট আপনার উপর বিল্ড জন্য সহজ এরকম একটির পেয়েছেন কি রিটার্ন কিছু প্রয়োজন নেই!
মিলহাউস

উত্তরগুলি কী পরামর্শ দেয় তার বিপরীতে, আপনার দ্বিতীয় স্নিপেটে আপনার প্রথম যা ছিল তা পুরোপুরি সূক্ষ্ম এবং POSTডেটা পরিচালনা করার সঠিক উপায় ।
ব্রেট রায়ান

এই ক্ষেত্রে এটি নাল ফিরে যাচ্ছে। @RestController পাবলিক ক্লাস RESTControllerExample {@RequestMapping (মান = "/ কর্মচারী", পদ্ধতি = RequestMethod.GET) সর্বজনীন শূন্য getEmployeeNames () {কর্মচারীসোর্স.সেটেম্প্লয়েস (); System.out.println ("আমি সম্পন্ন"); }}
স্প্যান্ডে

উত্তর:


256

আপনি অকার্যকর ফিরে আসতে পারেন, তারপরে আপনাকে @ রেসপন্সস্ট্যাটাস (মান = HttpStatus.OK) দিয়ে আপনার পদ্ধতিটি চিহ্নিত করতে হবে আপনার @ রেসপনসবডি দরকার নেই

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

কেবলমাত্র পদ্ধতিগুলি 200 টি স্ট্যাটাস কোডের তাত্পর্য ফিরিয়ে আনুন, অন্য তিনটি জিনিসের মধ্যে আপনার কাছে থাকা সমস্ত কিছুই:

  • অকার্যকর ফিরে আসুন এবং এর সাথে পদ্ধতিটি চিহ্নিত করুন @ResponseStatus(value = HttpStatus.OK)
  • কোনও বস্তু ফিরে করুন এবং এটি দিয়ে চিহ্নিত করুন @ResponseBody
  • একটি HttpEntityউদাহরণ ফেরত দিন

2
যদি রানটাইম ব্যতিক্রমগুলির মধ্যে ঘটে যায়, এইচটিটিপি 500 ফিরিয়ে দেওয়া হবে এবং 200 নয়। সুতরাং আপনার সামনের প্রান্তের হ্যান্ডেল ব্যর্থ হলে, ব্যতিক্রম / ত্রুটি বার্তাটি সঠিকভাবে প্রদর্শিত হবে।
লি চি কিম

27
আসলে, আপনার সেট করার দরকার নেই @ResponseStatusএবং করা উচিত নয়। কেবলমাত্র থাকার @ResponseBodyএকটি উপর voidহ্যান্ডলার জরিমানা যথেষ্ট।
ব্রেট রায়ান

11
আমি মনে করি
শূন্য

1
@ স্প্যাস্পর্প 200 পোস্টের জন্য সঠিক কারণ এটি কোনও দেহ রাখার জন্য নয়।
ব্রেট রায়ান 16

8
@ ব্র্যাটরিয়ান কেবল একটি মন্তব্য হিসাবে, কমপক্ষে একটি REST এপিআইয়ের জন্য এটি একটি সাধারণ অনুশীলন যে কোনও পোস্ট তৈরির বিষয়বস্তু তৈরির জন্য ব্যবহার করা হবে সেই ক্ষেত্রে এটি সাধারণত তৈরি সত্তার আইডি, সম্পূর্ণ তৈরি সত্তা বা কোনও লিঙ্ক ফেরত দেয় পড়া অপারেশন। কোনও বিষয়বস্তু সহ একটি 200 স্ট্যাটাস রিটার্ন একটি REST এপিআই দৃষ্টিকোণ থেকে বিভ্রান্তিকর হতে পারে।
raspacorp

43

আপনি যথাযথ শিরোনাম দিয়ে একটি প্রতিক্রিয়া এন্টিটি সহজেই ফিরে আসতে পারেন:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}

যদি কেউ আমার একই সমস্যার মধ্যে পড়ে তবে এটি বসন্তের পুরানো সংস্করণে কাজ করে না (৪.১.১) আমি ৫০০ টি ত্রুটি পাব। আমি 4.2.0 এ আপগ্রেড করেছি এবং এটি দুর্দান্ত কাজ করে
সস

200 খালি ফিরে আসার এটি আমার পছন্দসই উপায় way স্প্রিং ৪.১ এর পরিবর্তে বিল্ডার প্যাটার্ন ব্যবহার করুন: রিসপনস এন্টিটি.টোক ()। বিল্ড ();
গ্রিন টার্টল

3
যদিও কম্পাইল বলে মনে হয়, এটা নিম্নলিখিত সতর্কবাণী দেয়ResponseEntity is a raw type. References to generic type ResponseEntity<T> should be parameterized
Gonzalo.-

8

আপনি "রেসপন্সটিটিটি" অবজেক্টটি ফিরিয়ে দিতে পারেন। প্রতিক্রিয়া অবজেক্টটি তৈরি করার সময় (এতে রেসপন্স বডি এবং এইচটিটিপি স্থিতি কোড রয়েছে) এবং প্রতিক্রিয়া অবজেক্টের বাইরে তথ্য পাওয়ার সময় "রেসপন্স এন্টিটি" অবজেক্টটি ব্যবহার করা খুব সুবিধাজনক।

গেটহাইডার্স (), গেটবডি (), গেটকন্টেন্টটাইপ (), গেটস্ট্যাটাসকোড () ইত্যাদির মতো পদ্ধতিগুলি রেসপন্সএন্টিটি অবজেক্ট পড়ার কাজটিকে খুব সহজ করে তোলে।

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


3
ব্রাউজারে আমার জন্য সেটিং @ResponseStatus(HttpStatus.NO_CONTENT)সমাধান XML Parsing Error: no root element foundহয়েছে
অ্যালিওপি

3

হ্যাঁ, আপনি voidরিটার্ন টাইপের সাথে @ রেসপন্সবডি ব্যবহার করতে পারেন :

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

1
তাহলে রিটার্ন টাইপ কেমন হবে .. এটি কি এইচটিটিপি স্থিতি কোড?
স্প্যান্ডে

@techBeginner এই ক্ষেত্রে 200 (ঠিক আছে)।
Lakatos Gyula

2

শূন্যতা ফিরিয়ে দেওয়ার ক্ষেত্রে কোনও অসুবিধা নেই @ResponseBodyএবং আপনার POSTঅনুরোধ করা উচিত ।

অন্যরা সাফল্যের স্থিতি উল্লেখ করার পরিবর্তে ব্যতিক্রম হ্যান্ডলার রুটিনের মধ্যে ত্রুটিগুলি সংজ্ঞায়িত করতে HTTP স্থিতি কোডগুলি ব্যবহার করুন। আপনার কাছে থাকা একটি সাধারণ পদ্ধতি একটি প্রতিক্রিয়া কোড ফেরত দেবে 200যা আপনি চান, কোনও ব্যতিক্রম হ্যান্ডলার তারপরে একটি ত্রুটিযুক্ত বস্তু এবং একটি ভিন্ন কোড (অর্থাত 500) ফেরত দিতে পারে ।


1

তবে আপনার সিস্টেমটি আকার এবং কার্যকারিতা বৃদ্ধির সাথে সাথে ... আমি মনে করি যে সবসময় কোনও জসন ফিরে আসা মোটেই খারাপ ধারণা নয়। আরও কি কোনও আর্কিটেকচারাল / "বিগ স্কেল ডিজাইন" বিষয়।

আপনি সর্বদা দুটি জেনার ক্ষেত্র সহ একটি জেএসওএন পুনরুদ্ধার সম্পর্কে ভাবতে পারেন: কোড এবং ডেটা। কোডটি এমন একটি সংখ্যাসূচক কোড যা অপারেশনটির সাফল্য নির্দিষ্ট করে এবং ডেটা হ'ল অপারেশন / পরিষেবার সাথে সম্পর্কিত কোনও অ্যাডিশনাল ডেটা।

আসুন, যখন আমরা কোনও পরিষেবা সরবরাহকারী ব্যাকএন্ড ব্যবহার করি, কোনও পরিষেবা ঠিকভাবে কাজ করে কিনা তা পরীক্ষা করে নেওয়া যায়।

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


0

একটি অ্যাসিক্রোনাস পদ্ধতির জন্য আমি যা করেছি তা এখানে কোডের উদাহরণ

@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void importDataFromFile(@RequestParam("file") MultipartFile file) 
{
    accountingSystemHandler.importData(file, assignChargeCodes);
}

এই টীকাটি ব্যবহার করার জন্য আপনার যা প্রয়োজন তা আপনার পদ্ধতি থেকে কোনও জিনিস ফেরত দেওয়ার দরকার নেই যাতে আপনার পদ্ধতিটি প্রতিটি ক্ষেত্রে ঠিকঠাক ফিরে আসে

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