JavaRush /Java Blogu /Random-AZ /Spring Boot Controllers-də İstisna İdarəetmə
Павел
Səviyyə

Spring Boot Controllers-də İstisna İdarəetmə

Qrupda dərc edilmişdir
MƏQALƏ DÖVRÜNÜN MÜNDƏRİCASI Yenidən salam! Klaviaturanızın tozunu təmizləməyin vaxtıdır. Yay-boot layihəsi yaradın. Maven asılılıqlarından bizə lazımdır:
<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>
Daha ətraflı oxumadan əvvəl layihə strukturu yaradın: Spring Boot Controllers-də İstisna İdarəetmə - 1 BusinessException və CustomException:
public class BusinessException extends Exception{
    public BusinessException(String message) {
        super(message);
    }
}

public class CustomException extends Exception{
    public CustomException(String message) {
        super(message);
    }
}
Cavab sinfi
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;
    }
}
İndi mən qulaqlarımla bir hiylə edəcəyəm və sözü Aleksey Kutepova verəcəyəm, yazısında " Bahar nəzarətçilərində istisnaların idarə edilməsi" məqaləsində o, bu faylları düzgün məzmunla necə dolduracağımızı söyləyəcək. Yavaş-yavaş oxuyun, bütün nümunələri diqqətlə layihənizə köçürün, işləyin və Postman-da sınayın. Alekseyin məqaləsində aşağıdakı sətir sizin üçün suallar doğurdusa: istehsal = APPLICATION_JSON_VALUE , onda bilin ki, bunun istisnalarla heç bir əlaqəsi yoxdur, o deyir ki, standart olaraq bu nəzarətçinin bütün üsulları JSON-u qaytaracaq. Lazım gələrsə, xüsusi metodda bu dəyər başqa MediaType- a dəyişdirilə bilər.Əgər onu oxumusunuzsa, davam edin. Yuxarıdakı məqalə işləyicilər üçün müxtəlif variantlardan bəhs edir. Onlardan ən çevik olanı: @ControllerAdvice - bu, səhv olarsa, həm kodu, həm də standart cavabın gövdəsini dəyişməyə imkan verir. Bundan əlavə, bir üsulla birdən çox istisnaları idarə etməyə imkan verir. Ancaq bu, hamısı deyil, daha ətraflı oxusanız, təkmilləşdirilmiş @ControllerAdvice-i tamamilə pulsuz əldə edəcəksiniz. Gəlin bəzi hazırlıq işləri görək: Cavabın həm fərdi, həm də standart səhv mesajlarını göstərməsini istəyirəm. Bunu etmək üçün Cavab sinfində dəyişiklik edək : daha bir sahə əlavə edin
private String debugMessage;
Əlavə konstruktor yaradaq:
public Response(String message, String debugMessage) {
    this.message = message;
    this.debugMessage = debugMessage;
}
və yeni sahə üçün Getter və Setter yaratmağı unutmayın. İndi mətləbə. Başqa bir nəzarətçi yazaq:
@RestController
public class Example7Controller {
    @GetMapping(value = "/testExtendsControllerAdvice")
    public ResponseEntity<?> testExtendsControllerAdvice(@RequestBody Response response) {
        return  ResponseEntity.ok(response);
    }
}
Gəlin poçtalyonda sınaqdan keçirək: JSON-u http://localhost:8080/testExtendsControllerAdvice ünvanına göndərin
{
    "message": "message"
}
Cavab olaraq 200 statusu və bədən alacağıq
{
    "message": "message",
    "debugMessage": null
}
İndi açıq şəkildə səhv JSON göndərəcəyik
{
    11"message": "message"
}
Cavab olaraq biz 400 statusu (nə demək olduğunu unutmusunuzsa, internetdə axtarın) və boş cavab orqanı alacağıq. Təbii ki, heç kim bundan razı deyil, gəlin bununla mübarizə aparaq. Əvvəllər biz sıfırdan @ControllerAdvice yaratdıq, lakin Spring Boot-da bir şablon var - ResponseEntityExceptionHandler . O, artıq bir çox istisnaları idarə edir, məsələn: NoHandlerFoundException , HttpMessageNotReadableException , MethodArgumentNotValidException və s. Bu sinif səhvləri idarə edir. Onun adları tutacaq + istisna adı prinsipinə əsaslanan bir dəstə metod var . Bəzi əsas istisnaları idarə etmək istəyiriksə, bu sinifdən miras alırıq və istədiyiniz metodu ləğv edirik . Gəlin standart məsləhət sinfini yekunlaşdıraq
@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);
    }
}
Diqqət etdiyiniz kimi, HttpMessageNotReadableException üçün cavabdeh olan işləyici ləğv edilib . Bu istisna nəzarətçi metoduna gələn sorğunun mətni oxunmaz olduqda baş verir - məsələn, səhv JSON. Bu istisna üçün handleHttpMessageNotReadable () metodu cavabdehdir . Yanlış JSON ilə yenidən sorğu verək: http://localhost:8080/testExtendsControllerAdvice ünvanına
{
    11"message": "message"
}
Biz 400 kodu ilə cavab alırıq (Bad Request) və bədən:
{
    "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]"
}
İndi cavab yalnız düzgün kodu deyil, həm də məlumat mesajları olan bir orqanı ehtiva edir. Düzgün JSON Sorğusu ilə necə işlədiyini yoxlayaq:
{
    "message": "message"
}
Cavab aldıq:
{
    "message": "message",
    "debugMessage": null
}
Düzünü desəm, cavabda null dəyəri olan sahənin olması xoşuma gəlmir , biz bunu indi tez düzəldəcəyik. Cavab sinfinə keçin və tələb olunan sahəyə annotasiya qoyun
@JsonInclude(JsonInclude.Include.NON_NULL)
private String debugMessage;
Layihəni yenidən başladın, əvvəlki sorğunu yenidən edirik və cavabda alırıq:
{
    "message": "message"
}
@JsonInclude(JsonInclude.Include.NON_NULL) annotasiyası sayəsində bu sahə yalnız onu qeyd etdiyimiz halda cavaba daxil ediləcək. @JsonInclude Jackson annotasiya kitabxanasına daxildir , onun nə edə biləcəyini bilmək çox faydalıdır. Seçmək üçün iki məqalə var: Cekson annotasiyaları. Müəllif tərcümə etdi, lakin tərcüməni tamamlamadı ; Google Translit əla iş görür. Validasiya Bu mövzunu validasiya kimi bir anlayışla tamamlamaq lazımdır. Sadəcə olaraq, bu, obyektin gözlədiyimiz obyekt olduğunu yoxlamaqdır. Məsələn: “Telefon kataloqu” proqramında verilənlər bazasında telefon nömrələrinin olub-olmadığını yoxlamaq lazımdırsa, verilənlər bazasına daxil olmamışdan əvvəl istifadəçinin rəqəmlər əvəzinə hərflər daxil olub-olmadığını yoxlamaq məntiqlidir. Təsdiqlə bağlı üç məqalə, artan mürəkkəblik: Baharda paxlaların yoxlanılması Bahar Çərçivəsində DTO təsdiqinin qurulması Spring Boot-da məlumatların yoxlanılması Biz bu gün üçün nəzəriyyəni bitirdik. Təlim üçün aşağıdakı tapşırığı təklif edirəm: NightclubBouncer tətbiqini həyata keçirməlisiniz. Tələblər: 1) Proqram JSON-u giriş kimi qəbul etməli və verilənlər bazasına yazmalıdır. JSON nümunəsi:
{
    "name": "Katy Perry"
    “status”:super star”
}
Cavabın mətnində aşağıdakı yazı olmalıdır: Xoş gəldiniz + ad ! 2) Tətbiq aşağıdakı üsulları həyata keçirməlidir: - verilənlər bazasından müştəriyə (Poçttal) qeydin id ilə çıxarılması. - sahə üzrə qeydin silinməsi: ad . 3) Dto qatından obyektə və geriyə xəritəçəkmə həyata keçirilməlidir . 4) Gələn JSON-da status sahəsi aşağıdakılara bərabər deyilsə, proqram KickInTheAssException xətası atmalıdır (onu özünüz hazırlamalısınız) : super ulduz 5) KickInTheAssException xətası ControllerAdvice tərəfindən idarə olunmalıdır və cavab orqanında aşağıdakılar olmalıdır: mesaj: “Səni bir daha burada görməyə icazə vermə! Cavab statusu 400 olmalıdır. 6) Standart xəta EntityNotFoundException , məsələn, yalnız Katy Perry kluba gəlib id = 1 ilə verilənlər bazasında saxlansa və siz “id ilə qeydi göstərin” metodunu çağırıb istədiyiniz zaman baş verir. verilənlər bazasında olmayan id = 2 ilə qeydi göstərmək üçün . Bu səhv ResponseEntityExceptionHandler sinifinin ləğv edilmiş metodu ilə idarə olunmalıdır , hansını özünüz müəyyən etmək sizə bağlıdır. Cavab müvafiq statusa malik olmalıdır. 7) Doğrulamanı edin: sadə seçim - JSON sahələri null olmamalıdır və ya daha çətin, "ad" sahəsi latın əlifbasının iki sözündən ibarət olmalıdır və hər ikisi böyük hərflə başlamalıdır. Etibarsız dəyərlər bir istisna atmalı, hər hansı bir şəkildə idarə etməli, müvafiq səhv kodunu və səhv mesajını çap etməlidir: Doğrulama yoxdur. Və bütün bunları Lombok kitabxanasından istifadə etmədən həyata keçirin, onu layihə asılılığı kimi daxil etməyin 😅
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION