JavaRush /جاوا بلاگ /Random-SD /اسپرنگ بوٽ ڪنٽرولرز ۾ استثنا هينڊلنگ

اسپرنگ بوٽ ڪنٽرولرز ۾ استثنا هينڊلنگ

گروپ ۾ شايع ٿيل
مضمونن جي سائيڪن جا مضمون هيلو ٻيهر! اهو توهان جي ڪيبورڊ کي مٽي ڪرڻ جو وقت آهي. هڪ اسپرنگ بوٽ پروجيڪٽ ٺاهيو. ماوين انحصار کان اسان کي ضرورت آهي:
<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) ايپليڪيشن کي ھيٺين طريقن تي عمل ڪرڻ گھرجي: - ڊيٽابيس کان ڪلائنٽ (پوسٽمين) تائين id ذريعي رڪارڊ ڪڍڻ. - فيلڊ ذريعي رڪارڊ کي ختم ڪرڻ: نالو . 3) dto پرت کان اداري ۽ واپس تائين ميپنگ کي لاڳو ڪيو وڃي . 4) ايپليڪيشن کي لازمي طور تي KickInTheAssException غلطي اڇلائڻ گهرجي (توهان کي ان کي پاڻ کي ترقي ڪرڻ جي ضرورت آهي) جيڪڏهن ايندڙ JSON ۾ اسٽيٽس فيلڊ برابر نه آهي: سپر اسٽار 5) 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