Berbagi teknologi

SpringBoot: Respon terpadu SpringBoot dan penanganan pengecualian terpadu

2024-07-06

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

I. Pendahuluan

Saat mengembangkan aplikasi Spring Boot, cara penanganan hasil respons dan pengecualian memiliki dampak penting pada kemampuan pemeliharaan, skalabilitas, dan kolaborasi tim proyek. Hasil respons yang tersebar dan logika penanganan pengecualian sering kali menyebabkan kode berlebihan yang sulit untuk dipahami dan dipelihara. Oleh karena itu, pengembalian hasil terpadu dan penanganan pengecualian terpadu adalah salah satu strategi utama untuk meningkatkan kualitas proyek.

2. Pengembalian hasil terpadu

Menyatukan pengembalian hasil biasanya berarti menentukan format respons standar untuk semua metode pengontrol. Hal ini dapat dicapai dengan membuat satu atau lebih kelas entitas respons yang berisi bidang umum seperti kode status, pesan, dan data. Setelah metode pengontrol memproses logika bisnis, metode ini akan mengisi kolom ini dan mengembalikannya ke klien.

Selanjutnya, mari kita lihat cara mencapai pengembalian hasil terpadu di SpringBoot.

1. Tentukan objek respons yang umum

Buat objek respons umum, tentukan skenario pengembalian yang berhasil dan gagal, dan pastikan bahwa objek pengembalian umum digunakan di antarmuka.

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

2. Tentukan kode status respons antarmuka

Mendefinisikan kumpulan kode status umum adalah salah satu kunci inti untuk pengembalian hasil terpadu. Pendekatan ini tidak hanya meningkatkan kegunaan dan pemeliharaan API, namun juga memungkinkan klien untuk mengurai dan memproses data respons dengan lebih efisien. Pendekatan ini juga memberikan standar yang jelas dan konsisten untuk diikuti oleh pengembang API.

public enum ResultEnum {

    SUCCESS(200 ,"请求处理成功"),
    SERVICE_ERROR(500, "服务器异常,请稍后重试");

    public final Integer code;

    public final String message;

    ResultEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

3. Menentukan metode penanganan keberhasilan dan kegagalan yang terpadu

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

4. Pengendali merespons hasil secara seragam

@GetMapping("/testResult")
 public ResponseResult test() {
     // 模拟业务逻辑
     try {
         // 假设这里有一些业务逻辑
         return ResponseResult.success("success");
     } catch (Exception e) {
         // 捕获异常并返回错误信息
         return ResponseResult.error(ResultEnum.SERVICE_ERROR);
     }
 }

3. Penanganan pengecualian terpadu

Penanganan pengecualian terpadu menggunakan penangan pengecualian global untuk menangkap dan menangani pengecualian yang dilemparkan ke pengontrol. Pendekatan ini menghindari penulisan kode penanganan pengecualian duplikat di setiap metode pengontrol, dan juga membuat logika penanganan pengecualian lebih terpusat dan lebih mudah dikelola.

@SaranPengendaliRest
@RestControllerAdvice adalah anotasi gabungan, yang merupakan kombinasi dari @ControllerAdvice dan @ResponseBody. Hal ini terutama digunakan untuk menyediakan konfigurasi global untuk lapisan pengontrol, seperti penanganan pengecualian, pengikatan data, pemrosesan awal data, dll. Karena berisi @ResponseBody, semua metode yang diproses melalui @RestControllerAdvice akan menulis nilai yang dikembalikan ke badan respons HTTP secara default dan menyetel Tipe Konten yang sesuai.

@PenangananPengecualianR
Anotasi @ExceptionHandler digunakan untuk menandai metode yang menangani pengecualian yang diberikan pada pengontrol. Ketika suatu metode di pengontrol memunculkan pengecualian, Spring akan mencari metode beranotasi @ExceptionHandler yang dapat menangani pengecualian tersebut. Jika demikian, metode ini dipanggil dan responsnya dikembalikan.

Melihat

当使用@ControllerAdvice时,我们需要将@ResponseBody添加到异常处理方法上。
如果我们使用@RestControllerAdvice,就不需要添加。

1. Tentukan kelas pengecualian bisnis

Kelas pengecualian terpadu dapat membantu Anda mengelola kesalahan dan pengecualian dengan lebih baik, menjadikan penanganan kesalahan di seluruh sistem menjadi lebih konsisten dan dapat diprediksi.

public class BusinessException extends RuntimeException{

    private final ResultEnum resultEnum;

    public BusinessException(ResultEnum resultEnum, String message) {
        super(message);
        this.resultEnum = resultEnum;
    }

    public BusinessException(ResultEnum resultEnum) {
        this(resultEnum, resultEnum.message);
    }


}

2. Penangan pengecualian global

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({BusinessException.class})
    public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) {
        // 想处理的业务
        return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage());
    }

    /**
     * 其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public ResponseResult handleOtherExceptions(Exception e) {
        // 这里可以根据不同的异常类型返回不同的状态码和消息
        // 但为了简单起见,这里只返回一个通用的错误信息
        return ResponseResult.error(ResultEnum.SERVICE_ERROR);
    }

}

3. Pemrosesan dan penggunaan terpadu

@GetMapping("/testException1")
    public ResponseResult test1() {
        if (true) {
            // 业务场景
            throw new BusinessException(ResultEnum.SERVICE_ERROR);
        }

        return ResponseResult.success("success");
    }

Manfaat menggunakan penanganan pengecualian terpadu

penggunaan kembali kode: Hindari menulis hasil respon serupa dan kode penanganan pengecualian di banyak tempat.

Mudah dirawat: Saat Anda perlu mengubah format respons atau logika penanganan pengecualian, Anda hanya perlu memodifikasinya di satu tempat.

Kerja tim: Anggota tim dapat lebih mudah memahami dan mengikuti standar pengkodean terpadu.

Skalabilitas: Jika Anda perlu menambahkan tipe respons baru atau logika penanganan pengecualian, perluas saja yang sudah ada.