JavaRush /Java Blog /Random-TK /Bahar aýakgap dolandyryjylarynda kadadan çykma

Bahar aýakgap dolandyryjylarynda kadadan çykma

Toparda çap edildi
DÜZGÜN SIKLE MAZMUNY againene-de salam! Klawiaturany tozanlamagyň wagty geldi. Bahar-boot taslamasyny dörediň. Maven garaşlylyklaryndan bize gerek:
<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>
Has giňişleýin okamazdan ozal taslama gurluşyny dörediň: Bahar aýakgap dolandyryjylarynda kadadan çykma - 1 BusinessException we CustomException:
public class BusinessException extends Exception{
    public BusinessException(String message) {
        super(message);
    }
}

public class CustomException extends Exception{
    public CustomException(String message) {
        super(message);
    }
}
we jogap synpy
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;
    }
}
Indi bolsa, gulagym bilen bir hile ederin we Alekseý Kutepowa söz bererin, " Bahar dolandyryjylarynda kadadan çykma" atly makalasynda bize bu faýllary dogry mazmun bilen nädip doldurmalydygyny aýdyp berer. Slowlyuwaş-ýuwaşdan okaň, ähli mysallary taslamaňyza üns bilen göçüriň, “Postman” -da işlediň we synagdan geçiriň. Alekseýiň makalasynda aşakdaky setir size sorag döreden bolsa: öndürýär = APPLICATION_JSON_VALUE , onda kadadan çykma bilen hiç hili baglanyşygynyň ýokdugyny biliň, adaty ýagdaýda bu gözegçiniň ähli usullarynyň JSON-y yzyna gaýtaryp berjekdigini aýdýar. Zerur bolsa, belli bir usul bilen bu bahany başga bir MediaType görnüşine ýazyp bolar . Eger okan bolsaňyz, dowam ediň. Aboveokardaky makalada işleýänler üçin dürli wariantlar ara alnyp maslahatlaşylýar. Olardan iň çeýe: @ControllerAdvice - ýalňyşlyk ýüze çykan halatynda kody we adaty jogap görnüşini üýtgetmäge mümkinçilik berýär. Mundan başga-da, bir usulda birbada birnäçe kadadan çykmalary çözmäge mümkinçilik berýär. That'söne bularyň hemmesi däl, has giňişleýin okasaň, gowulaşan @ControllerAdvice-i düýbünden mugt alarsyň . Geliň, käbir taýýarlyk işlerini edeliň: Jogabyň adaty we adaty ýalňyş habarlaryny görkezmegini isleýärin. Munuň üçin “Jogap” synpyna üýtgeşme girizeliň : ýene bir meýdan goşuň
private String debugMessage;
Goşmaça konstruktor döredeliň:
public Response(String message, String debugMessage) {
    this.message = message;
    this.debugMessage = debugMessage;
}
we täze meýdan üçin Getter we Setter döretmegi ýatdan çykarmaň. Indi. Başga bir gözegçi ýazalyň:
@RestController
public class Example7Controller {
    @GetMapping(value = "/testExtendsControllerAdvice")
    public ResponseEntity<?> testExtendsControllerAdvice(@RequestBody Response response) {
        return  ResponseEntity.ok(response);
    }
}
Poçta bölüminde synag edeliň: JSON-y http: // localhost: 8080 / testExtendsControllerAdvice-a iberiň
{
    "message": "message"
}
Muňa jogap hökmünde 200 we beden statusyny alarys
{
    "message": "message",
    "debugMessage": null
}
Indi aç-açan nädogry JSON ibereris
{
    11"message": "message"
}
Muňa jogap hökmünde 400 statusyny alarys (manysyny ýatdan çykaran bolsaňyz, internetden gözläň) we boş jogap organy. Elbetde, hiç kim muňa razy däl, geliň oňa garşy göreşeliň. Öň @ControllerAdvice- den başlap döredipdik , ýöne “Bahar Boot” -da bir şablon bar - ResponseEntityExceptionHandler . Ol eýýäm köp kadadan çykmalary çözýär, mysal üçin: NoHandlerFoundException , HttpMessageNotReadableException , MethodArgumentNotValidException we başgalar. Bu synp ýalňyşlyklary dolandyrýar. Onda bir topar usul bar, olaryň atlary prinsip tutawajy + kadadan çykma adyna esaslanýar . Esasy kadadan çykma islesek, bu synpdan miras alarys we islenýän usuly ýok ederis . Adaty maslahat beriş synpyny gutaralyň
@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);
    }
}
Üns berşiňiz ýaly, HttpMessageNotReadableException üçin jogapkär işleýji ýok edildi . Bu kadadan çykma, gözegçilik usulyna gelýän haýyşyň mazmuny okalmadyk ýagdaýynda ýüze çykýar - mysal üçin nädogry JSON. HandHttpMessageNotReadable () usuly bu kadadan çykma üçin jogapkärdir . Nädogry JSON bilen ýene bir haýyş edeliň: http: // localhost: 8080 / testExtendsControllerAdvice
{
    11"message": "message"
}
400 kody (Erbet haýyş) we beden bilen jogap alýarys:
{
    "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]"
}
Indi jogap diňe bir dogry kody däl, eýsem habarly habarlary öz içine alýar. Dogry JSON haýyşy bilen nähili işleýändigini barlap göreliň:
{
    "message": "message"
}
Jogap aldyk:
{
    "message": "message",
    "debugMessage": null
}
Dogrusyny aýtsam, jogabyň gymmaty ýok bir meýdany öz içine almagyny halamok , indi çalt düzederis. Jogap synpyna giriň we zerur meýdanyň üstünde bellik goýuň
@JsonInclude(JsonInclude.Include.NON_NULL)
private String debugMessage;
Taslamany täzeden başlaýarys, öňki haýyşy täzeden edýäris we jogap hökmünde:
{
    "message": "message"
}
@JsonInclude (JsonInclude.Include.NON_NULL) düşündirişiniň kömegi bilen , bu meýdan diňe kesgitlesek jogap jogaplaryna goşular. @JsonInclude Jeksonyň düşündiriş kitaphanasyna girýär , näme edip biljekdigini bilmek gaty peýdaly. Ine, saýlamaly iki makala: Jeksonyň düşündirişleri. Authorazyjy terjime etdi, ýöne terjimesini tamamlamady ; Google Translit gaty gowy iş edýär. Barlamak Bu mowzugy tassyklamak ýaly düşünje bilen doldurmaly. Plyönekeý söz bilen aýdylanda, bu obýektiň garaşýan zadymyzdygyny barlamakdyr. Mysal üçin: “Telefon bukjasy” programmasynda telefon belgileriniň bardygyny barlamaly bolsak, maglumatlar bazasyna girmezden ozal ulanyjynyň sanlaryň ýerine harplar girendigini ýa-da ýokdugyny barlamak mantyklydyr. Barlamak, çylşyrymlylygy ýokarlandyrmak üçin üç makala: Bahar paslynda noýba tassyklamasy Bahar çarçuwasynda Bahar çarçuwasynyň maglumat tassyklamasynda DTO tassyklamasyny düzmek Şu gün üçin teoriýa bilen tamamladyk. Okuw üçin aşakdaky meseläni teklip edýärin: “NightclubBouncer” programmasyny durmuşa geçirmeli. Talaplar: 1) Programma JSON-y giriş hökmünde kabul etmeli we maglumat bazasyna ýazmaly. JSON mysal:
{
    "name": "Katy Perry"
    “status”:super star”
}
Jogap bölüminde aşakdaky ýazgy bolmaly: Hoş geldiňiz + ady ! 2) Programma aşakdaky usullary durmuşa geçirmeli: - maglumatlar bazasyndan müşderä (Poçtaçy) id arkaly ýazgy çykarmak. - ýazgyny meýdan boýunça pozmak: ady . 3) dto gatlagyndan desga we arka tarap kartalaşdyrylmaly . 4) Gelýän JSON-daky ýagdaý meýdany deň däl bolsa, programma KickInTheAssException ýalňyşyny atmaly ( super ýyldyz 5) KickInTheAssException ýalňyşlygy ControllerAdvice tarapyndan dolandyrylmaly we jogap organynda bolmaly habar: “Men sizi ýene şu ýerde görmäge ýol bermäň! Jogap ýagdaýy 400. 6 bolmaly _ _ maglumat bazasynda ýok id = 2 bilen ýazgyny görkezmek . Bu ýalňyşlyk , özüňizi kesgitlemek size bagly bolan “ResponseEntityExceptionHandler” synpynyň ýokaşdyrylan usuly bilen çözülmelidir . Jogap degişli statusa eýe bolmalydyr. 7) Barlamagy ýerine ýetiriň: ýönekeý bir wariant - JSON meýdanlary boş bolmaly däl ýa-da has kyn bolmaly däl, "at" meýdany latyn elipbiýiniň iki sözünden ybarat bolmaly we ikisi hem baş harp bilen başlamaly. Nädogry bahalar kadadan çykma etmeli, ony islendik usul bilen dolandyrmaly, degişli säwlik kody we säwlik habaryny çap etmeli: Hakykat ýok. Bularyň hemmesini Lombok kitaphanasyny ulanman durmuşa geçiriň, taslama garaşlylyk hökmünde goşmaň 😅
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION