JavaRush /Blog Jawa /Random-JV /Pangecualian Penanganan ing Spring Boot Controllers
Павел
tingkat

Pangecualian Penanganan ing Spring Boot Controllers

Diterbitake ing grup
ISI SIKLUS ARTIKEL Halo maneh! Iku wektu kanggo bledug keyboard. Nggawe proyek spring-boot. Saka dependensi maven kita butuh:
<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>
Sadurunge maca luwih lanjut, gawe struktur proyek: Penanganan Pengecualian ing Pengontrol Boot Spring - 1 BusinessException lan CustomException:
public class BusinessException extends Exception{
    public BusinessException(String message) {
        super(message);
    }
}

public class CustomException extends Exception{
    public CustomException(String message) {
        super(message);
    }
}
lan kelas Response
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;
    }
}
Lan saiki, aku bakal nggawe trick karo kuping lan menehi lantai kanggo Alexey Kutepov, ing artikel Penanganan Pengecualian ing Pengontrol Spring, dheweke bakal ngandhani carane ngisi file kasebut kanthi konten sing bener. Waca alon-alon, kanthi ati-ati nyalin kabeh conto menyang proyek sampeyan, mbukak lan nyoba ing Postman. Yen ing artikel Alexey baris ing ngisor iki wungu pitakonan kanggo sampeyan: mrodhuksi = APPLICATION_JSON_VALUE , banjur ngerti sing ora ana hubungane karo pangecualian nangani, ngandika standar kabeh cara controller iki bakal bali JSON. Yen perlu, ing cara tartamtu, nilai iki bisa diganti menyang MediaType liyane. Yen sampeyan wis maca, pindhah menyang. Artikel ing ndhuwur mbahas opsi sing beda kanggo pawang. Sing paling fleksibel: @ControllerAdvice - ngidini sampeyan ngganti kode lan awak respon standar yen ana kesalahan. Kajaba iku, ngidini sampeyan nangani macem-macem pengecualian bebarengan ing siji cara. Nanging ora kabeh, yen sampeyan maca luwih lanjut, sampeyan bakal entuk @ControllerAdvice sing luwih apik kanthi gratis. Ayo dadi nindakake sawetara karya preparatory: Aku pengin respon kanggo nampilake pesen kesalahan adat lan standar. Kanggo nindakake iki, ayo gawe owah-owahan menyang kelas Response : nambah siji lapangan maneh
private String debugMessage;
Ayo nggawe konstruktor tambahan:
public Response(String message, String debugMessage) {
    this.message = message;
    this.debugMessage = debugMessage;
}
lan aja lali nggawe Getter lan Setter kanggo lapangan anyar. Saiki menyang titik. Ayo nulis controller liyane:
@RestController
public class Example7Controller {
    @GetMapping(value = "/testExtendsControllerAdvice")
    public ResponseEntity<?> testExtendsControllerAdvice(@RequestBody Response response) {
        return  ResponseEntity.ok(response);
    }
}
Ayo nyoba ing tukang pos: Kirim JSON menyang http://localhost:8080/testExtendsControllerAdvice
{
    "message": "message"
}
Nanggepi kita bakal nampa status 200 lan awak
{
    "message": "message",
    "debugMessage": null
}
Saiki kita bakal ngirim JSON sing ora bener
{
    11"message": "message"
}
Nanggepi, kita bakal nampa status 400 (yen sampeyan wis lali apa tegese, goleki ing Internet) lan awak respon kosong. Mesthi wae ora ana sing seneng, ayo padha perang. Sadurunge, kita nggawe @ControllerAdvice saka awal, nanging ing Spring Boot ana cithakan - ResponseEntityExceptionHandler . Wis nangani akeh pengecualian, contone: NoHandlerFoundException , HttpMessageNotReadableException , MethodArgumentNotValidException lan liya-liyane. Kelas iki nangani kesalahan. Nduwe pirang-pirang cara, jeneng kasebut adhedhasar gagang prinsip + jeneng pangecualian. Yen kita pengin nangani sawetara pangecualian dhasar, banjur kita oleh warisan saka kelas iki lan ngganti cara sing dikarepake . Ayo rampungake kelas penasehat standar
@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);
    }
}
Kaya sing sampeyan ngerteni, pawang sing tanggung jawab kanggo HttpMessageNotReadableException wis diganti . Pangecualian iki kedadeyan nalika awak panyuwunan sing teka ing cara pengontrol ora bisa diwaca - contone, JSON sing salah. Cara handleHttpMessageNotReadable () tanggung jawab kanggo pangecualian iki . Ayo njaluk maneh kanthi JSON sing salah: menyang http: // localhost: 8080/testExtendsControllerAdvice
{
    11"message": "message"
}
Kita nampa tanggapan kanthi kode 400 (Panjaluk Buruk) lan awak:
{
    "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]"
}
Saiki tanggapan kasebut ora mung ngemot kode sing bener, nanging uga badan kanthi pesen informatif. Ayo priksa cara kerjane karo Panjaluk JSON sing bener:
{
    "message": "message"
}
Kita nampa jawaban:
{
    "message": "message",
    "debugMessage": null
}
Jujur, aku ora seneng yen tanggapan kasebut ngemot lapangan kanthi nilai null , kita bakal cepet ndandani saiki. Pindhah menyang kelas Response lan wenehi anotasi ing lapangan sing dibutuhake
@JsonInclude(JsonInclude.Include.NON_NULL)
private String debugMessage;
Kita miwiti maneh proyek kasebut, nggawe panjalukan sadurunge maneh, lan ing respon kita entuk:
{
    "message": "message"
}
Thanks kanggo @JsonInclude(JsonInclude.Include.NON_NULL) anotasi , lapangan iki mung bakal kalebu ing respon yen kita nemtokake. @JsonInclude kalebu ing perpustakaan anotasi Jackson , iku banget migunani kanggo ngerti apa bisa nindakake. Kene rong artikel kanggo milih saka: Jackson anotasi. Penulis nerjemahake, nanging ora ngrampungake terjemahan ; Google Translit nindakake tugas sing apik. Validasi Perlu ditambahake topik iki kanthi konsep kayata validasi. Cukup, iki mriksa manawa obyek kasebut minangka obyek sing dikarepake. Contone: yen ing aplikasi "Direktori Telpon" kita kudu mriksa anané nomer telpon ing database, banjur sadurunge pindhah menyang database, iku logis kanggo mriksa apa pangguna wis ngetik huruf tinimbang nomer. Telung artikel babagan validasi, ing nambah kerumitan: Validasi kacang buncis ing Spring Nyiyapake validasi DTO ing Spring Framework Validasi data ing Spring Boot Kita wis rampung karo teori kanggo dina iki. Kanggo latihan, aku nyaranake tugas ing ngisor iki: Sampeyan kudu ngetrapake aplikasi NightclubBouncer. Syarat: 1) Aplikasi kudu nampa JSON minangka input lan nulis menyang database. Tuladha JSON:
{
    "name": "Katy Perry"
    “status”:super star”
}
Lan isi wangsulan kudu ngemot tulisan: Sugeng rawuh + jeneng ! 2) Aplikasi kudu ngleksanakake cara ing ngisor iki: - outputting rekaman dening id saka database kanggo klien (Postman). - mbusak rekaman miturut kolom: jeneng . 3) Pemetaan saka lapisan dto menyang entitas lan mburi kudu ditindakake . 4) Aplikasi kudu mbuwang kesalahan KickInTheAssException (sampeyan kudu ngembangake dhewe) yen kolom status ing JSON mlebu ora padha karo: super star 5) Kesalahan KickInTheAssException kudu ditangani dening ControllerAdvice , lan awak respon kudu ngemot pesen: "Aja nganti aku ketemu sampeyan kene maneh! Status respon kudu 400. 6) Kesalahan standar EntityNotFoundException , sing kedadeyan, contone, yen mung Katy Perry teka ing klub kasebut lan disimpen ing basis data kanthi id = 1 , lan sampeyan nyebat metode "display record by id" lan pengin. kanggo nampilake rekaman kanthi id = 2 , sing ora ana ing basis data. Kesalahan iki kudu ditangani kanthi cara sing ditindhes saka kelas ResponseEntityExceptionHandler , sing sampeyan kudu ngerti dhewe. Tanggapan kudu nduweni status sing cocog. 7) Nindakake validasi: pilihan sing prasaja - kolom JSON kudu ora null, utawa luwih angel, kolom "jeneng" kudu kalebu rong tembung saka alfabet Latin lan loro-lorone kudu diwiwiti kanthi huruf kapital. Nilai sing ora sah kudu mbuwang pengecualian, nangani kanthi cara apa wae, nyetak kode kesalahan sing cocog lan pesen kesalahan: Ora ana validasi. Lan ngleksanakake kabeh iki tanpa nggunakake perpustakaan Lombok, ora kalebu minangka ketergantungan proyek 😅
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION