Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan masalah pengecualian global SpringBoot

Bagaimana untuk menyelesaikan masalah pengecualian global SpringBoot

王林
王林ke hadapan
2023-05-16 10:49:121587semak imbas

SpringBoot ialah produk yang dilahirkan untuk memudahkan satu siri isu seperti penciptaan, jalankan, penyahpepijatan dan penggunaan aplikasi Spring konfigurasi. Kami Hanya mengikut spesifikasi dan memperkenalkan kebergantungan yang berkaitan untuk membina projek WEB dengan mudah

Dalam pembangunan projek sebenar, pelbagai situasi tidak normal sering berlaku dalam program, terutamanya sebagai pelayan Sebagai pembangun, kami sentiasa menulis antara muka untuk menyediakan panggilan hadapan Dalam kes pembahagian kerja dan kerjasama, pengecualian tidak boleh dielakkan Jika maklumat yang salah didedahkan secara langsung kepada pengguna, pengalaman itu boleh dibayangkan, dan ia akan membahayakan pengguna . Untuk penggodam, maklumat pengecualian terperinci selalunya sangat membantu...

Gunakan kaedah cuba-tangkap untuk menangkap maklumat pengecualian secara manual dan kemudian mengembalikan set hasil yang sepadan. (Contohnya: dirangkumkan ke dalam objek Hasil); walaupun kaedah ini secara tidak langsung menyelesaikan masalah pendedahan ralat, kelemahan yang sama juga jelas, meningkatkan jumlah kod Apabila terdapat terlalu banyak pengecualian, lapisan tangkapan yang sepadan menjadi lebih banyak banyak. Sukar untuk menguruskan pemadanan antara pengecualian perniagaan dan kod ralat ini, jadi cara terbaik ialah mengawal situasi global melalui konfigurasi mudah...

Mari kita lihat penyelesaian yang disediakan oleh Spring Boot

1 Kebergantungan import

Tambahkan kebergantungan spring-boot-starter-web dalam pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Pengecualian tersuai
Semasa proses pembangunan aplikasi, kecuali Dalam Selain pengecualian sistem itu sendiri, pengecualian yang digunakan dalam senario perniagaan yang berbeza juga berbeza Untuk menjadi lebih relevan dengan tajuk "Pengecualian global yang mudah dikendalikan", tentukan pengecualian anda sendiri dan lihat cara untuk menangkap...<.>

package com.battcn.exception;

/**
 * 自定义异常
 *
 * @author Levin
 * @since
public class CustomException extends RuntimeException

    private static final long serialVersionUID = 4564124491192825748L;

    private int code;

    public CustomException() {
        super();
    }

    public CustomException(int code, String message) {
        super(message);
        this.setCode(code);
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}

2 Templat maklumat pengecualian

mentakrifkan format maklumat pengecualian yang dikembalikan, supaya gaya maklumat pengecualian lebih bersatu

package com.battcn.exception;

/**
 * @author Levin
 * @since
public class ErrorResponseEntity

    private int code;
    private String message;
    // 省略 get set
3 Lapisan kawalan

Lihat lebih dekat untuk melihat sama ada ia sama dengan kod yang ditulis seperti biasa Apa bezanya, jom baca terus...

package com.battcn.controller;

import com.battcn.exception.CustomException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 全局异常演示
 *
 * @author Levin
 * @since
@RestController
public class ExceptionController

    @GetMapping("/test3")
    public String test3(Integer num) {
        // TODO 演示需要,实际上参数是否为空通过 @RequestParam(required = true)  就可以控制
        if (num == null) {
            throw new CustomException(400, "num不能为空");
        }
        int i = 10 / num;
        return "result:"
4 Pengendalian pengecualian (kunci)

Gambaran keseluruhan anotasi:

  • @ControllerAdviceTangkap pengecualian yang dilemparkan oleh lapisan Pengawal Jika @ResponseBody ditambahkan, maklumat pemulangan akan berada dalam format JSON.

  • @RestControllerAdvice adalah bersamaan dengan gabungan @ControllerAdvice dan @ResponseBody.

  • @ExceptionHandlerMengendalikan satu jenis pengecualian secara seragam untuk mengurangkan pertindihan dan kerumitan kod.

Buat kelas GlobalExceptionHandler dan tambah anotasi @RestControllerAdvice untuk mentakrifkan kelas pemberitahuan pengecualian, dan kemudian tambah @ExceptionHandler kepada kaedah yang ditentukan untuk merealisasikan penangkapan pengecualian...

package com.battcn.config;

import com.battcn.exception.CustomException;
import com.battcn.exception.ErrorResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 全局异常处理
 *
 * @author Levin
 * @since
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler


    /**
     * 定义要捕获的异常 可以多个 @ExceptionHandler({})
     *
     * @param request  request
     * @param e        exception
     * @param response response
     * @return
    @ExceptionHandler(CustomException.class)
    public ErrorResponseEntity customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        CustomException exception = (CustomException) e;
        return new ErrorResponseEntity(exception.getCode(), exception.getMessage());
    }

    /**
     * 捕获  RuntimeException 异常
     * TODO  如果你觉得在一个 exceptionHandler 通过  if (e instanceof xxxException) 太麻烦
     * TODO  那么你还可以自己写多个不同的 exceptionHandler 处理不同异常
     *
     * @param request  request
     * @param e        exception
     * @param response response
     * @return
    @ExceptionHandler(RuntimeException.class)
    public ErrorResponseEntity runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        RuntimeException exception = (RuntimeException) e;
        return new ErrorResponseEntity(400, exception.getMessage());
    }

    /**
     * 通用的接口映射异常处理方
     */
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,
                                                             HttpStatus status, WebRequest request) {
        if (ex instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;
            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status);
        }
        if (ex instanceof MethodArgumentTypeMismatchException) {
            MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex;
            logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName()
                    + ",信息:" + exception.getLocalizedMessage());
            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);
        }
        return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);
    }
}
Ujian

Selepas melengkapkan persediaan, mulakan Aplikasi Bab17 Daripada keputusan ujian di bawah, anda boleh mendapati bahawa ia sangat mudah, kod telah menjadi lebih bersih, dan skalabiliti juga telah bertambah baik...

Lawati http://localhost:8080/test3

{"code":400,"message":"num不能为空"}

Lawati http://localhost:8080/test3?num=0

{"code":400,"message":"/ by zero"}

Lawati http://localhost:8080 /test3?num=5

result:2

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah pengecualian global SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam