স্প্রিং বুট রেস্ট কন্ট্রোলার কীভাবে বিভিন্ন এইচটিপিপি স্থিতি কোডগুলি ফিরিয়ে আনবেন?


104

আমি একটি সাধারণ REST এপিআইয়ের জন্য স্প্রিং বুট ব্যবহার করছি এবং কিছু ব্যর্থ হলে সঠিক HTTP স্ট্যাটাস কোডটি ফিরিয়ে দিতে চাই।

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
@ResponseBody
@ResponseStatus( HttpStatus.OK )
public RestModel create(@RequestBody String data) {
    // code ommitted..
    // how do i return a correct status code if something fails?
}

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

উত্তর:


120

আপনি ব্যবহার করতে পারেন বিভিন্ন বিকল্প আছে। বেশ ভাল উপায় হ'ল পরিচালনার জন্য ব্যতিক্রম এবং ক্লাস ব্যবহার করা হয় @ControllerAdvice:

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.CONFLICT)  // 409
    @ExceptionHandler(DataIntegrityViolationException.class)
    public void handleConflict() {
        // Nothing to do
    }
}

এছাড়াও আপনি HttpServletResponseনিয়ামক পদ্ধতিতে পাস করতে পারেন এবং কেবল প্রতিক্রিয়া কোড সেট করতে পারেন :

public RestModel create(@RequestBody String data, HttpServletResponse response) {
    // response committed...
    response.setStatus(HttpServletResponse.SC_ACCEPTED);
}

দয়া করে বিশদের জন্য এই দুর্দান্ত ব্লগ পোস্টটি দেখুন: স্প্রিং এমভিসিতে ব্যতিক্রম হ্যান্ডলিং


বিঃদ্রঃ

স্প্রিং এমভিসিতে @ResponseBodyটিকা ব্যবহার করে অতিরিক্ত কাজ হয় - এটি ইতিমধ্যে @RestControllerটীকাতে অন্তর্ভুক্ত ।


মন্তব্যের মতোই, আমি ১৫ মিনিট আগে একটি পরীক্ষা করেছি এবং '@ রেসটাকডোডি' ছাড়াই একটি '@ রিস্টকন্ট্রোলার' তার পদ্ধতির উপর স্ট্রিংটি দেহের অভ্যন্তরে নয়, ফরোয়ার্ড URL হিসাবে ফিরিয়ে দিয়েছে। আমি বসন্ত / স্প্রিংবুটে আমার খুব সুন্দর আছি তাই কেন তা উল্লেখ করতে পারি না
অ্যানারিওন

@ অ্যানারিওন উত্তরের একটি টাইপো রয়েছে - আমাদের আসলে '@RestControllerAdvice' দরকার, '@RestController' নয়।
yoliho

এটি কোনও টাইপ নয়। এই অংশটি একটি
নিয়ামককে

4
দ্রষ্টব্য, javax.servlet.http.HttpServletResponseএটিতে সমস্ত স্ট্যাটাসকোড org.springframework.http.HttpStatusনেই বলে মনে হয়। সুতরাং আপনি HttpStatus.UNPROCESSABLE_ENTITY.value()প্রতিক্রিয়া.সেট স্ট্যাটাসে ইন-মানটি পাস করতে ব্যবহার করতে পারেন । এছাড়াও এই পুরোপুরি ব্যবহার ত্রুটি হ্যান্ডলিং জন্য কাজ করে @ExceptionHandler
ইগোর

43

এটি করার একটি উপায় আপনি রিটার্ন অবজেক্ট হিসাবে রেসপন্সএন্টিটি ব্যবহার করতে পারেন।

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)

public ResponseEntity<?> create(@RequestBody String data) {

if(everything_fine)
    return new ResponseEntity<>(RestModel, HttpStatus.OK);
else
    return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);

}

4
স্প্রিংয়ের পরবর্তী সংস্করণগুলিতে নালটি ব্যবহার করার দরকার নেই: নতুন রেসপন্স এনটিটি <> (এইচটিপিস্ট্যাটাস.নোT_ফাউন্ড)
কং

4

এই কোড ব্যবহার করে দেখুন:

@RequestMapping(value = "/validate", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<ErrorBean> validateUser(@QueryParam("jsonInput") final String jsonInput) {
    int numberHTTPDesired = 400;
    ErrorBean responseBean = new ErrorBean();
    responseBean.setError("ERROR");
    responseBean.setMensaje("Error in validation!");

    return new ResponseEntity<ErrorBean>(responseBean, HttpStatus.valueOf(numberHTTPDesired));
}

যেহেতু এটি একটি পুরানো প্রশ্ন তাই আপনার প্যাকেজ এবং সংস্করণ তথ্য যুক্ত করা উচিত যা আপনি উল্লেখ করেন।
ZF007

আপনি একটি উদাহরণ বাস্তবায়ন অন্তর্ভুক্ত করতে পারেন ErrorBean?
ব্রেন্ট ব্র্যাডবার্ন

4

একটি দুর্দান্ত উপায় হ'ল স্প্রিংয়ের প্রতিক্রিয়া স্ট্যাটাস এক্সেপশন ব্যবহার করা

কোনও ResponseEntityবা অনুরূপ ফেরতের পরিবর্তে আপনি ResponseStatusExceptionনিয়ামকের কাছ থেকে কোনও HttpStatusকারণ এবং কারণ দিয়ে নিক্ষেপ করুন , উদাহরণস্বরূপ:

throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Cause description here");

বা:

throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Cause description here");

এটির মতো একটি বডি সহ HTTP স্থিতি (যেমন 400 খারাপ অনুরোধ) যুক্ত ক্লায়েন্টের প্রতিক্রিয়ার ফলাফল:

{
  "timestamp": "2020-07-09T04:43:04.695+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "Cause description here",
  "path": "/test-api/v1/search"
}

একটি REST ক্লায়েন্ট দ্বারা সহজ, পরিষ্কার এবং গ্রাসযোগ্য।
আলেকজ

3

আপনি যদি কোনও কাস্টম সংজ্ঞায়িত স্থিতি কোডটি ফিরিয়ে দিতে চান তবে আপনি এখানে প্রতিক্রিয়াশক্তিটি ব্যবহার করতে পারেন:

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
public ResponseEntity<?> create(@RequestBody String data) {
    int customHttpStatusValue = 499;
    Foo foo = bar();
    return ResponseEntity.status(customHttpStatusValue).body(foo);
}

কাস্টমহ্যাট্পস্ট্যাটাসভ্যালু স্ট্যান্ডার্ড এইচটিটিপি স্থিতি কোডগুলির মধ্যে বা এর বাইরে যে কোনও পূর্ণসংখ্যা হতে পারে।


আমি এই সাবলীল এপিআই পদ্ধতির পছন্দ করি।
v.ladynev

0

স্থিতি কোড ফেরত দেওয়ার বিভিন্ন উপায় রয়েছে, 1: রেস্টকন্ট্রোলার শ্রেণীর বেসরেস্ট ক্লাস প্রসারিত হওয়া উচিত, বেসরেস্ট ক্লাসে আমরা ব্যতিক্রম হ্যান্ডেল করতে পারি এবং প্রত্যাশিত ত্রুটি কোডগুলি ফিরিয়ে আনতে পারি। উদাহরণ স্বরূপ :

@RestController
@RequestMapping
class RestController extends BaseRest{

}

@ControllerAdvice
public class BaseRest {
@ExceptionHandler({Exception.class,...})
    @ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorModel genericError(HttpServletRequest request, 
            HttpServletResponse response, Exception exception) {
        
        ErrorModel error = new ErrorModel();
        resource.addError("error code", exception.getLocalizedMessage());
        return error;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.