JavaRush /Java блогу /Random-KY /Жазгы жүктөө контроллерлеринде өзгөчөлүктү иштетүү
Павел
Деңгээл

Жазгы жүктөө контроллерлеринде өзгөчөлүктү иштетүү

Группада жарыяланган
МАКАЛА ЦИКЛИНИН МАЗМУНУ Дагы бир жолу салам! Клавиатураңыздын чаңын тазалоого убакыт келди. Жазгы жүктөө долбоорун түзүү. 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;
    }
}
Эми мен кулагым менен бир айла кылып, сөздү Алексей Кутеповго берем, анын жазгы контроллерлордогу өзгөчөлүктү иштетүү деген макаласында ал бул файлдарды кантип туура мазмун менен толтуруу керектигин айтып берет. Акырын окуп, бардык мисалдарды проектиңизге кылдаттык менен көчүрүңүз, Почтачыда иштетиңиз жана сынап көрүңүз. Эгерде Алексейдин макаласында төмөнкү сап сиз үчүн суроолорду жаратса: өндүрөт = APPLICATION_JSON_VALUE , анда анын өзгөчө иштетүүгө эч кандай тиешеси жок экенин бorңиз, демейки шартта бул контроллердин бардык ыкмалары 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 codeу менен жооп алабыз (Жаман суроо) жана дене:
{
    "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]"
}
Эми жооп туура codeду гана эмес, маалыматтык билдирүүлөр менен денени камтыйт. Келгиле, анын туура JSON сурамы менен кантип иштээрин текшерип көрөлү:
{
    "message": "message"
}
Биз жооп алдык:
{
    "message": "message",
    "debugMessage": null
}
Чынын айтсам, жоопто null мааниси бар талаа камтылганы мага жаккан жок , биз аны азыр тез арада оңдойбуз. Жооп классына өтүп , керектүү талаага annotationны коюңуз
@JsonInclude(JsonInclude.Include.NON_NULL)
private String debugMessage;
Биз долбоорду кайра баштайбыз, мурунку өтүнүчтү кайра жасайбыз жана жоопто биз:
{
    "message": "message"
}
@JsonInclude(JsonInclude.Include.NON_NULL) annotationсынын аркасында , бул талаа биз аны көрсөткөндө гана жоопко кошулат. @JsonInclude Джексон annotationлар китепканасына киргизилген , ал эмне кыла аларын билүү абдан пайдалуу. Бул жерде тандоо үчүн эки макала бар: Джексон annotationлары. Author которгон, бирок котормосун аягына чыгарган жок ; Google Translit сонун иш кылат. Валидация Бул теманы валидация сыяктуу түшүнүк менен толуктоо зарыл. Жөнөкөй сөз менен айтканда, бул an object биз күткөн an object экенин текшерүү. Мисалы: эгерде “Телефон каталогу” тиркемесинде биз маалымат базасында телефон номерлеринин бар-жоктугун текшеришибиз керек болсо, анда маалымат базасына кирүүдөн мурун, колдонуучу сандардын ордуна тамгаларды киргизген-киргизбегенин текшерүү логикалык жактан туура болот. Валидация боюнча үч макала, татаалдашып баратат: Жаздагы буурчактарды валидациялоо Жазгы алHowтарда DTO валидациясы Жазгы жүктөөдө берorштердин валидациясы Биз бүгүн теорияны бүтүрдүк. Тренинг үчүн мен төмөнкү тапшырманы сунуштайм: Сиз NightclubBouncer тиркемесин ишке ашырууңуз керек. Талаптар: 1) Тиркеме JSONди киргизүү катары кабыл алышы жана маалымат базасына жазуусу керек. JSON мисалы:
{
    "name": "Katy Perry"
    “status”:super star”
}
Жана жооптун тексти төмөнкү жазууну камтышы керек: Welcome + name ! 2) Тиркеме төмөнкү ыкмаларды ишке ашырууга тийиш: - маалыматтар базасынан кардарга (Почтачыга) id боюнча жазууну чыгаруу. - талаа боюнча жазууну жок кылуу: аты . 3) dto катмарынан an objectке жана артка карта түзүү ишке ашырылышы керек . 4) Колдонмо KickInTheAssException катасын ыргытышы керек (аны өзүңүз иштеп чыгышыңыз керек), эгерде кирүүчү JSONдагы статус талаасы төмөнкүгө барабар болбосо: супер жылдыз 5) KickInTheAssException катасын ControllerAdvice иштетиши керек жана жооп органы билдирүү: "Мени бул жерде дагы көрүшүмө жол бербе! Жооптун статусу 400 болушу керек. 6) Стандарттык ката EntityNotFoundException , мисалы, Кэти Перри клубга келип, id = 1 менен маалымат базасына сакталган болсо , жана сиз "id боюнча жазууну көрсөтүү" ыкмасын чакырсаңыз жана каалаган маалымат базасында жок id = 2 менен жазууну көрсөтүү үчүн . Бул ката ResponseEntityExceptionHandler классынын жокко чыгарылган ыкмасы менен чечorши керек , кайсынысын өзүңүз чечишиңиз керек. Жооп тиешелүү статуска ээ болушу керек. 7) Текшерүүнү жасаңыз: жөнөкөй вариант - JSON талаалары нөл болбошу керек, же андан да кыйыныраак, "ат" талаасы латын алфавитинин эки сөзүнөн туруп, экөө тең баш тамга менен башталышы керек. Жараксыз маанилер өзгөчөлүктү ыргытып, аны кандайдыр бир жол менен иштетип, тиешелүү ката codeун жана ката кабарын басып чыгарышы керек: Текшерүү жок. Жана мунун баарын Ломбок китепканасын колдонбостон ишке ашырыңыз, аны долбоорго көз карандылык катары кошпоңуз 😅
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION