JavaRush /جاوا بلاگ /Random-UR /اسپرنگ بوٹ کنٹرولرز میں استثنیٰ ہینڈلنگ

اسپرنگ بوٹ کنٹرولرز میں استثنیٰ ہینڈلنگ

گروپ میں شائع ہوا۔
آرٹیکل سائیکل کے مشمولات پھر سے ہیلو! یہ اپنے کی بورڈ کو دھولنے کا وقت ہے۔ اسپرنگ بوٹ پروجیکٹ بنائیں۔ maven انحصار سے ہمیں ضرورت ہے:
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <java.version>1.8</java.version>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/><!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
مزید پڑھنے سے پہلے، پروجیکٹ کا ڈھانچہ بنائیں: اسپرنگ بوٹ کنٹرولرز میں استثنیٰ ہینڈلنگ - 1 BusinessException اور CustomException:
public class BusinessException extends Exception{
    public BusinessException(String message) {
        super(message);
    }
}

public class CustomException extends Exception{
    public CustomException(String message) {
        super(message);
    }
}
اور رسپانس کلاس
public class Response {

    private String message;

    public Response() {
    }

    public Response(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
اور اب، میں اپنے کانوں سے ایک چال کروں گا اور الیکسی کوٹیپوف کو فرش دے دوں گا، اپنے مضمون Exception Handling in Spring Controllers میں، وہ ہمیں بتائے گا کہ ان فائلوں کو صحیح مواد سے کیسے بھرا جائے۔ آہستہ سے پڑھیں، تمام مثالوں کو اپنے پروجیکٹ میں احتیاط سے کاپی کریں، پوسٹ مین میں چلائیں اور ٹیسٹ کریں۔ اگر Alexey کے مضمون میں درج ذیل سطر نے آپ کے لیے سوالات اٹھائے ہیں: produces = APPLICATION_JSON_VALUE ، تو جان لیں کہ اس کا استثنیٰ ہینڈلنگ سے کوئی تعلق نہیں ہے، یہ کہتا ہے کہ پہلے سے طے شدہ طور پر اس کنٹرولر کے تمام طریقے JSON کو واپس کریں گے۔ اگر ضروری ہو تو، ایک مخصوص طریقہ میں، اس قدر کو دوسرے میڈیا ٹائپ پر اوور رائڈ کیا جا سکتا ہے۔ اگر آپ نے اسے پڑھ لیا ہے، تو آگے بڑھیں۔ اوپر والا مضمون ہینڈلرز کے لیے مختلف اختیارات پر بحث کرتا ہے۔ ان میں سے سب سے زیادہ لچکدار: @ControllerAdvice - یہ آپ کو غلطی کی صورت میں معیاری جواب کے کوڈ اور باڈی دونوں کو تبدیل کرنے کی اجازت دیتا ہے۔ اس کے علاوہ، یہ آپ کو ایک ہی طریقہ میں ایک سے زیادہ مستثنیات کو سنبھالنے کی اجازت دیتا ہے۔ لیکن یہ سب کچھ نہیں ہے، اگر آپ مزید پڑھیں تو آپ کو بہتر @ControllerAdvice بالکل مفت ملے گا۔ آئیے کچھ تیاری کا کام کرتے ہیں: میں چاہتا ہوں کہ جواب حسب ضرورت اور معیاری غلطی کے پیغامات دونوں کو ظاہر کرے۔ ایسا کرنے کے لیے، آئیے رسپانس کلاس میں تبدیلی کرتے ہیں : ایک اور فیلڈ شامل کریں۔
private String debugMessage;
آئیے ایک اضافی کنسٹرکٹر بنائیں:
public Response(String message, String debugMessage) {
    this.message = message;
    this.debugMessage = debugMessage;
}
اور نئے فیلڈ کے لیے گیٹر اور سیٹٹر بنانا نہ بھولیں۔ اب بات کی طرف۔ آئیے ایک اور کنٹرولر لکھیں:
@RestController
public class Example7Controller {
    @GetMapping(value = "/testExtendsControllerAdvice")
    public ResponseEntity<?> testExtendsControllerAdvice(@RequestBody Response response) {
        return  ResponseEntity.ok(response);
    }
}
آئیے پوسٹ مین میں ٹیسٹ کریں: JSON کو http://localhost:8080/testExtendsControllerAdvice پر بھیجیں
{
    "message": "message"
}
جواب میں ہمیں 200 کا درجہ اور ایک جسم ملے گا۔
{
    "message": "message",
    "debugMessage": null
}
اب ہم واضح طور پر غلط JSON بھیجیں گے۔
{
    11"message": "message"
}
جواب میں، ہمیں 400 کا اسٹیٹس ملے گا (اگر آپ بھول گئے ہیں کہ اس کا کیا مطلب ہے، تو اسے انٹرنیٹ پر دیکھیں) اور ایک خالی جوابی باڈی ملے گی۔ یقیناً کوئی بھی اس سے خوش نہیں، آئیے اس کا مقابلہ کریں۔ پہلے، ہم نے شروع سے @ControllerAdvice بنایا تھا ، لیکن اسپرنگ بوٹ میں ایک ٹیمپلیٹ ہے - ResponseEntityExceptionHandler ۔ یہ پہلے ہی بہت سے مستثنیات کو سنبھالتا ہے، مثال کے طور پر: NoHandlerFoundException , HttpMessageNotReadableException , MethodArgumentNotValidException اور دیگر۔ یہ کلاس غلطیوں کو سنبھالتی ہے۔ اس میں طریقوں کا ایک گروپ ہے، جن کے نام اصول ہینڈل + استثنا نام پر مبنی ہیں۔ اگر ہم کچھ بنیادی استثناء کو سنبھالنا چاہتے ہیں، تو ہم اس کلاس سے وراثت میں آتے ہیں اور مطلوبہ طریقہ کو اوور رائڈ کرتے ہیں ۔ آئیے پہلے سے طے شدہ ایڈوائزری کلاس کو حتمی شکل دیتے ہیں۔
@ControllerAdvice
public class DefaultAdvice extends ResponseEntityExceptionHandler {//унаследовались от обработчика-заготовки

    @ExceptionHandler(BusinessException.class)
    public ResponseEntity<Response> handleException(BusinessException e) {
        Response response = new Response(e.getMessage());
        return new ResponseEntity<>(response, HttpStatus.OK);
    }
//Небольшое отступление: В обработчике выше, обратите внимание на HttpStatus.OK,
//он может быть и HttpStatus.BAD_REQUEST or другим, тут ограничений нет,
//попробуйте поменять статусы и потестить этот обработчик


    @Override//переопределor метод родительского класса
    protected ResponseEntity<Object> handleHttpMessageNotReadable
            (HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        Response response = new Response("Не правильный JSON",ex.getMessage());
        return new ResponseEntity<>(response, status);
    }
}
جیسا کہ آپ نے دیکھا، HttpMessageNotReadableException کے لیے ذمہ دار ہینڈلر کو اوور رائیڈ کر دیا گیا ہے ۔ یہ استثنیٰ اس وقت ہوتا ہے جب کنٹرولر طریقہ پر آنے والی درخواست کا باڈی پڑھنے کے قابل نہ ہو - مثال کے طور پر، غلط JSON۔ handleHttpMessageNotReadable () طریقہ اس استثنا کے لیے ذمہ دار ہے ۔ آئیے غلط JSON کے ساتھ دوبارہ درخواست کریں: to http://localhost:8080/testExtendsControllerAdvice
{
    11"message": "message"
}
ہمیں کوڈ 400 (خراب درخواست) اور باڈی کے ساتھ جواب موصول ہوتا ہے:
{
    "message": "Не правильный JSON",
    "debugMessage": "JSON parse error: Unexpected character ('1' (code 49)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('1' (code 49)): was expecting double-quote to start field name\n at [Source: (PushbackInputStream); line: 2, column: 6]"
}
اب جواب میں نہ صرف صحیح کوڈ ہے بلکہ معلوماتی پیغامات کے ساتھ ایک باڈی بھی ہے۔ آئیے چیک کریں کہ یہ درست JSON درخواست کے ساتھ کیسے کام کرتا ہے:
{
    "message": "message"
}
ہمیں جواب ملا:
{
    "message": "message",
    "debugMessage": null
}
سچ پوچھیں تو، مجھے یہ پسند نہیں ہے کہ جواب میں ویلیو null کے ساتھ ایک فیلڈ ہو ، ہم اسے جلدی سے ٹھیک کر دیں گے۔ رسپانس کلاس میں جائیں اور مطلوبہ فیلڈ پر ایک تشریح ڈالیں۔
@JsonInclude(JsonInclude.Include.NON_NULL)
private String debugMessage;
ہم پروجیکٹ کو دوبارہ شروع کرتے ہیں، پچھلی درخواست دوبارہ کرتے ہیں، اور جواب میں ہمیں ملتا ہے:
{
    "message": "message"
}
@JsonInclude(JsonInclude.Include.NON_NULL) تشریح کا شکریہ ، یہ فیلڈ صرف اس صورت میں جواب میں شامل کی جائے گی جب ہم اس کی وضاحت کریں۔ @JsonInclude جیکسن تشریحی لائبریری میں شامل ہے ، یہ جاننا بہت مفید ہے کہ یہ کیا کرسکتا ہے۔ یہاں سے منتخب کرنے کے لیے دو مضامین ہیں: جیکسن تشریحات۔ مصنف نے ترجمہ کیا، لیکن ترجمہ مکمل نہیں کیا ؛ گوگل ٹرانسلٹ بہت اچھا کام کرتا ہے۔ توثیق اس موضوع کو توثیق جیسے تصور کے ساتھ پورا کرنا ضروری ہے۔ سیدھے الفاظ میں، یہ ایک چیک ہے کہ اعتراض وہ چیز ہے جس کی ہم توقع کرتے ہیں۔ مثال کے طور پر: اگر "فون ڈائرکٹری" ایپلی کیشن میں ہمیں ڈیٹا بیس میں ٹیلی فون نمبرز کی موجودگی کو چیک کرنے کی ضرورت ہے، تو ڈیٹا بیس میں جانے سے پہلے، یہ جانچنا منطقی ہے کہ آیا صارف نے نمبروں کے بجائے حروف درج کیے ہیں۔ توثیق پر تین مضامین، بڑھتی ہوئی پیچیدگی میں: موسم بہار میں پھلیاں کی توثیق بہار کے فریم ورک میں ڈی ٹی او کی توثیق کو ترتیب دینا اسپرنگ بوٹ میں ڈیٹا کی توثیق ہم آج کے لیے تھیوری کے ساتھ مکمل کر چکے ہیں۔ تربیت کے لیے، میں مندرجہ ذیل کام کا مشورہ دیتا ہوں: آپ کو NightclubBouncer ایپلیکیشن کو لاگو کرنے کی ضرورت ہے۔ تقاضے: 1) درخواست کو JSON کو بطور ان پٹ قبول کرنا چاہیے اور ڈیٹا بیس پر لکھنا چاہیے۔ JSON مثال:
{
    "name": "Katy Perry"
    “status”:super star”
}
اور جواب کے باڈی میں درج ذیل نوشتہ ہونا چاہیے: Welcome + name ! 2) ایپلیکیشن کو مندرجہ ذیل طریقوں کو لاگو کرنا چاہیے: - ڈیٹا بیس سے کلائنٹ (پوسٹ مین) کو آئی ڈی کے ذریعے ریکارڈ آؤٹ پٹ کرنا۔ - فیلڈ کے لحاظ سے ریکارڈ کو حذف کرنا: name ۔ 3) dto پرت سے ہستی اور پیچھے کی نقشہ سازی کو لاگو کیا جانا چاہیے ۔ 4) اگر آنے والے JSON میں اسٹیٹس فیلڈ اس کے برابر نہیں ہے تو ایپلیکیشن کو KickInTheAssException ایرر پھینکنا چاہیے ( آپ کو اسے خود تیار کرنا ہوگا ) پیغام: "مجھے آپ کو یہاں دوبارہ دیکھنے نہ دیں! جواب کی حیثیت 400 ہونی چاہیے۔ 6) معیاری غلطی EntityNotFoundException ، جو اس وقت ہوتی ہے، مثال کے طور پر، اگر صرف کیٹی پیری کلب میں آئی اور id = 1 کے ساتھ ڈیٹا بیس میں محفوظ کی گئی، اور آپ نے "ڈسپلے ریکارڈ بذریعہ id" کے طریقہ کار کو کال کیا اور آپ چاہتے ہیں۔ id = 2 کے ساتھ ریکارڈ کو ظاہر کرنے کے لیے ، جو ڈیٹا بیس میں نہیں ہے۔ اس غلطی کو ResponseEntityExceptionHandler کلاس کے ایک اوور رائیڈڈ طریقہ سے ہینڈل کیا جانا چاہیے ، جس کا خود اندازہ لگانا آپ پر منحصر ہے۔ جواب کی مناسب حیثیت ہونی چاہیے۔ 7) توثیق کریں: ایک آسان آپشن - JSON فیلڈز کو کالعدم نہیں ہونا چاہیے، یا زیادہ مشکل، "نام" فیلڈ میں لاطینی حروف تہجی کے دو الفاظ پر مشتمل ہونا چاہیے اور ان دونوں کا آغاز بڑے حرف سے ہونا چاہیے۔ غلط اقدار کو مستثنیٰ ہونا چاہئے، اسے کسی بھی طرح سے ہینڈل کرنا چاہئے، مناسب ایرر کوڈ اور ایرر میسج پرنٹ کرنا چاہئے: کوئی توثیق نہیں۔ اور لومبوک لائبریری کا استعمال کیے بغیر اس سب کو لاگو کریں، اسے پروجیکٹ پر انحصار کے طور پر شامل نہ کریں 😅
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION