JavaRush /Блоги Java /Random-TG /Коркарди истисноӣ дар контроллерҳои пурборкунии баҳор
Павел
Сатҳи

Коркарди истисноӣ дар контроллерҳои пурборкунии баҳор

Дар гурӯҳ нашр шудааст
МУНДАРИҶАИ СИКЛИ МАҚОЛА Боз салом! Вақти он расидааст, ки клавиатураи худро тоза кунед. Лоиҳаи баҳорӣ эҷод кунед. Аз вобастагии 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;
    }
}
Ва акнун, ман бо гӯшҳои худ як ҳила мекунам ва суханро ба Алексей Кутепов медиҳам, дар мақолаи худ " Истисно дар контроллерҳои баҳор", ӯ ба мо мегӯяд, ки чӣ гуна ин файлҳоро бо мундариҷаи дуруст пур кунем. Оҳиста-оҳиста хонед, ҳама мисолҳоро ба лоиҳаи худ бодиққат нусхабардорӣ кунед, дар Postman иҷро кунед ва санҷед. Агар дар мақолаи Алексей сатри зерин барои шумо саволҳо ба миён оварда бошад: истеҳсол мекунад = APPLICATION_JSON_VALUE , пас бидонед, ки он ба коркарди истисно ҳеҷ рабте надорад, мегӯяд, ки ба таври нобаёнӣ ҳама усулҳои ин контроллер JSON-ро бармегардонанд. Агар лозим бошад, бо усули мушаххас ин арзиш метавонад ба дигар MediaType иваз карда шавад.Агар шумо онро хонда бошед, идома диҳед. Дар мақолаи боло вариантҳои гуногун барои коркардкунандагон муҳокима карда мешаванд. Аз ҳама чандиртарини онҳо: @ControllerAdvice - он ба шумо имкон медиҳад, ки дар сурати хатогӣ ҳам code ва ҳам матни посухи стандартиро тағир диҳед. Илова бар ин, он ба шумо имкон медиҳад, ки якчанд истисноҳоро якбора дар як усул ҳал кунед. Аммо ин ҳама нест, агар шумо минбаъд хонед, шумо @ControllerAdvice такмилёфтаро комилан ройгон мегиред . Биёед баъзе корҳои омодагиро иҷро кунем: Ман мехоҳам, ки посух ҳам паёмҳои хатогии фармоишӣ ва ҳам стандартиро нишон диҳад. Барои ин, биёед ба синфи Ҷавоб тағирот ворид кунем : як майдони дигар илова кунед
private String debugMessage;
Биёед як конструктори иловагӣ эҷод кунем:
public Response(String message, String debugMessage) {
    this.message = message;
    this.debugMessage = debugMessage;
}
ва барои майдони нав сохтани Getter ва Setter -ро фаромӯш накунед. Акнун ба нукта. Биёед контролери дигарро нависем:
@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-ро аз сифр офаридаем, аммо дар Spring Boot як қолаб мавҷуд аст - 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-и нодуруст дархост кунем: ба 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 ба китобхонаи тафсирҳои Ҷексон дохил карда шудааст , донистани он ки чӣ кор карда метавонад, хеле муфид аст. Дар ин ҷо ду мақола барои интихоб ҳастанд: эзоҳҳои Ҷексон. Муаллиф тарҷума кардааст, аммо тарҷумаро анҷом надодааст ; Google Translit кори хуб мекунад. Валидация Ин мавзуъро бо чунин мафхуме, ба мисли валидация пурра кардан лозим аст. Оддӣ карда гӯем, ин санҷишест, ки an object an objectест, ки мо интизорем. Масалан: агар дар замимаи «Феҳристи телефонҳо» мо бояд мавҷудияти рақамҳои телефонро дар базаи маълумот тафтиш кунем, пас пеш аз ворид шудан ба базаи маълумот мантиқӣ аст, ки корбар ба ҷои рақам ҳарф ворид кардааст ё на. Се мақола дар бораи тасдиқкунӣ, бо афзоиши мураккабӣ: Санҷиши лӯбиё дар фасли баҳор Ташкor тасдиқи DTO дар чаҳорчӯбаи баҳорӣ тасдиқи маълумот дар баҳори Boot Мо назарияи имрӯзаро ба итмом расондем. Барои омӯзиш ман вазифаи зеринро пешниҳод мекунам: Шумо бояд барномаи NightclubBouncer-ро амалӣ кунед. Талабот: 1) Барнома бояд JSON-ро ҳамчун вуруд қабул кунад ва ба пойгоҳи дода нависад. Намунаи JSON:
{
    "name": "Katy Perry"
    “status”:super star”
}
Ва матни посух бояд чунин навиштаҷот дошта бошад: Хуш омадед + ном ! 2) Барнома бояд усулҳои зеринро амалӣ намояд: - баровардани сабт аз рӯи id аз базаи маълумот ба муштарӣ (Почтачӣ). - нест кардани сабт аз рӯи майдон: ном . 3) Харитасозӣ аз қабати dto ба an object ва бозгашт бояд амалӣ карда шавад . 4) Барнома бояд хатои KickInTheAssException -ро партояд (шумо бояд онро худатон таҳия кунед), агар майдони вазъ дар JSON-и воридшаванда ба ин баробар набошад: superstar 5 ) Хатои KickInTheAssException бояд аз ҷониби ControllerAdvice коркард карда шавад ва мақоми посух бояд дорои паём: «Нагузоред, ки туро дар ин ҷо дигар бубинам! Ҳолати посух бояд 400 бошад. 6) Хатои стандартии EntityNotFoundException , ки масалан, агар танҳо Кэти Перри ба клуб омада, дар базаи маълумот бо id = 1 захира карда бошад ва шумо усули "дисплей сабт аз рӯи id" -ро даъват кардаед ва мехоҳед . барои намоиш додани сабт бо id = 2 , ки дар базаи маълумот нест. Ин хато бояд бо усули бекоркардаи синфи ResponseEntityExceptionHandler коркард карда шавад , ки кадомаш ба шумо вобаста аст, ки худатонро муайян кунед. Ҷавоб бояд мақоми мувофиқ дошта бошад. 7) Тасдиқро иҷро кунед: як варианти оддӣ - майдонҳои JSON набояд сифр бошанд ё мушкилтар, майдони "ном" бояд аз ду калимаи алифбои лотинӣ иборат бошад ва ҳардуи онҳо бояд бо ҳарфи калон оғоз шаванд. Қиматҳои беэътибор бояд истисно гузоранд, онро бо ҳар роҳ идора кунанд, рамзи хато ва паёми хатогии мувофиқро чоп кунанд: Тасдиқ нест. Ва ҳамаи инро бидуни истифодаи китобхонаи Ломбок амалӣ кунед, онро ҳамчун вобастагии лоиҳа дохил накунед 😅
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION