JavaRush /Java блогы /Random-KK /Көктемгі жүктеу контроллерлеріндегі ерекше жағдайларды өң...
Павел
Деңгей

Көктемгі жүктеу контроллерлеріндегі ерекше жағдайларды өңдеу

Топта жарияланған
МАҚАЛА ЦИКЛІНІҢ МАЗМҰНЫ Тағы да сәлем! Пернетақтаның шаңын тазалау уақыты келді. Spring-boot жобасын жасаңыз. 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 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 тамаша жұмыс істейді. Валидация Бұл тақырыпты валидация сияқты ұғыммен толықтыру қажет. Қарапайым тілмен айтқанда, бұл нысан біз күткен нысан екенін тексеру. Мысалы: егер «Телефон анықтамалығы» қосымшасында дерекқорда телефон нөмірлерінің бар-жоғын тексеру керек болса, онда дерекқорға кірер алдында пайдаланушының сандар орнына әріптерді енгізгенін тексеру қисынды. Валидация туралы үш мақала, артып келе жатқан күрделілік: Көктемде бұршақтарды тексеру Көктемгі жақтауында DTO валидациясын орнату Spring Boot бағдарламасында деректерді тексеру Біз бүгінгі теорияны аяқтадық. Жаттығу үшін мен келесі тапсырманы ұсынамын: NightclubBouncer қосымшасын енгізу керек. Талаптар: 1) Қолданба JSON-ды енгізу ретінде қабылдауы және дерекқорға жазуы керек. JSON мысалы:
{
    "name": "Katy Perry"
    “status”:super star”
}
Ал жауап мәтінінде келесі жазу болуы керек: Қош келдіңіз + аты ! 2) Қолданба келесі әдістерді жүзеге асыруы керек: - дерекқордан клиентке (Пошташы) id бойынша жазбаны шығару. - өріс бойынша жазбаны жою: name . 3) dto деңгейінен нысанға және кері салыстыруды жүзеге асыру қажет . 4) Кіріс JSON ішіндегі күй өрісі келесіге тең болмаса , қолданба KickInTheAssException қатесін шығаруы керек (оны өзіңіз жасауыңыз керек) : супер жұлдыз 5) KickInTheAssException қатесін ControllerAdvice өңдеуі керек және жауап корпусында мыналар болуы керек: хабарлама: «Сізді бұл жерде қайтадан көруге рұқсат етпеңіз! Жауап күйі 400 болуы керек. 6) EntityNotFoundException стандартты қатесі , мысалы, тек Кэти Перри клубқа келіп, дерекқорға id = 1 арқылы сақталса және сіз «id бойынша жазбаны көрсету» әдісіне қоңырау шалып , қажет болған жағдайда орын алады . дерекқорда жоқ id = 2 жазбаны көрсету үшін . Бұл қате ResponseEntityExceptionHandler сыныбының қайта анықталған әдісі арқылы өңделуі керек , оның қайсысы өзіңізді анықтауға байланысты. Жауап тиісті мәртебеге ие болуы керек. 7) Тексеруді орындаңыз: қарапайым опция - JSON өрістері нөл болмауы керек немесе одан да қиынырақ, «атауы» өрісі латын әліпбиінің екі сөзінен тұруы керек және олардың екеуі де бас әріптен басталуы керек. Жарамсыз мәндер ерекше жағдайды шығарып, оны кез келген жолмен өңдеуі, сәйкес қате codeын және қате туралы хабарды басып шығаруы керек: Тексеру жоқ. Мұның бәрін Ломбок кітапханасын пайдаланбай іске асырыңыз, оны жобаға тәуелділік ретінде қоспаңыз 😅
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION