در Spring MVC راه های زیادی برای ست کردن کد وضعیت دلخواه برای Http Response وجود دارد در این بخش به بررسی ارسال کد وضعیت توسط ResponseStatus@ میپردازیم
روی متد های کنترلر :
@ResponseStatus(HttpStatus.I_AM_A_TEAPOT) void teaPot() {}
هنگامی که میخواهیم سیگنال error را همراه با علت آن ارسال کنیم :
@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid") void onIllegalArgumentException(IllegalArgumentException exception) {}
هنگامی که از کد بالا استفاده کنیم Spring از HttpServletResponse.sendError() استفاده خواهد کرد و کاربر یک صفحه با توضیحات error دریافت خواهد کرد که برای REST مناسب نیست
* نکته ای که وجود دارد Spring موقعی از ResponseStatus@ استفاده میکند که Exception ای رخ نداده باشد
ارسال Http Status Code هنگام رخ دادن خطا :
به سه طریق میتوان ResponseStatus@ را بکار برد که Exception رخ داده را به Http Status Code تبدیل کند :
- با استفاده از ExceptionHandler@
- با استفاده از ControllerAdvice@
- پیاده سازی کلاس Exception مورد نظر
دو روش اول را میتوان یک متد رسیدگی Error تعریف و کد دلخواه را ارسال کرد و آن متد ها را با ResponseStatus@ مشخص و کد دلخواه را ارسال کرد در این حالت مانند متد های کنترلر MVC خواهد بود
راه حل سوم موقعی است که روشی پویا برای ارسال کد وضعیت نخواهیم :
@ResponseStatus(code = HttpStatus.BAD_REQUEST) class CustomException extends RuntimeException {}
* نکته ای که وجود دارد موقعی که ما یک کلاس از نوع Exception را با ResponseStatus@ تعریف میکنیم Spring همیشه متد HttpServletResponse.sendError() را صدا خواهد زد خواه دلیلی برای آن ست کرده باشیم و یا نکرده باشیم
* همینطور اگر کلاس پدر با ResponseStatus@ تعریف شده باشد هم باز HttpServletResponse.sendError() استفاده خواهد شد