技術共有

SpringBoot: SpringBoot の統合応答と統合例外処理

2024-07-06

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

I.はじめに

Spring Boot アプリケーションを開発する場合、応答結果と例外の処理方法は、プロジェクトの保守性、拡張性、チームのコラボレーションに重大な影響を与えます。応答結果と例外処理ロジックが分散していると、コードが冗長になり、理解や保守が困難になることがよくあります。したがって、統一された結果の戻りと統一された例外処理は、プロジェクトの品質を向上させるための重要な戦略の 1 つです。

2. 統一された結果の返却

返される結果を統一するということは、通常、すべてのコントローラー メソッドの標準応答形式を定義することを意味します。これは、ステータス コード、メッセージ、データなどの共通フィールドを含む 1 つ以上の応答エンティティ クラスを作成することで実現できます。コントローラー メソッドはビジネス ロジックを処理した後、これらのフィールドに値を設定し、クライアントに返します。

次に、SpringBoot で統一された結果を返す方法を見てみましょう。

1. 共通の応答オブジェクトを定義する

汎用応答オブジェクトを作成し、成功および失敗の戻りシナリオを定義し、汎用の戻りオブジェクトがインターフェイスで使用されるようにします。

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. インターフェース応答ステータスコードを定義する

ステータス コードの共通セットを定義することは、統一された結果を返すための中核となる鍵の 1 つです。このアプローチにより、API の使いやすさと保守性が向上するだけでなく、クライアントが応答データをより効率的に解析して処理できるようになり、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. 統合された成功および失敗の処理方法を定義する

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. コントローラーは結果に均一に応答します

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

3. 統一された例外処理

統合例外処理では、グローバル例外ハンドラーを使用して、コントローラーでスローされた例外をキャプチャして処理します。このアプローチにより、各コントローラー メソッドで重複した例外処理コードを記述することが回避され、例外処理ロジックがより集中化され、管理が容易になります。

@RestControllerアドバイス
@RestControllerAdvice は、@ControllerAdvice と @ResponseBody を組み合わせた結合アノテーションです。これは主に、例外処理、データ バインディング、データ前処理などのコントローラー層のグローバル構成を提供するために使用されます。 @ResponseBody が含まれているため、@RestControllerAdvice によって処理されるすべてのメソッドは、デフォルトで戻り値を HTTP 応答本文に書き込み、適切な Content-Type を設定します。

@例外ハンドルr
@ExceptionHandler アノテーションは、コントローラーでスローされた例外を処理するメソッドをマークするために使用されます。コントローラー内のメソッドが例外をスローすると、Spring は例外を処理できる @ExceptionHandler アノテーションが付けられたメソッドを探します。存在する場合、メソッドが呼び出され、その応答が返されます。

知らせ

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

1. ビジネス例外クラスを定義する

統合された例外クラスは、エラーと例外の管理を改善し、システム全体のエラー処理の一貫性と予測可能性を高めるのに役立ちます。

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. グローバル例外ハンドラ

@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. 統一的な処理と利用

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

        return ResponseResult.success("success");
    }

統合例外処理を使用する利点

コードの再利用: 同様の応答結果や例外処理コードを複数の場所に記述することは避けてください。

メンテナンスが簡単: 応答形式または例外処理ロジックを変更する必要がある場合、1 か所を変更するだけで済みます。

チームワーク: チームメンバーは、統一されたコーディング標準をより簡単に理解し、従うことができます。

スケーラビリティ: 新しい応答タイプまたは例外処理ロジックを追加する必要がある場合は、既存のものを拡張するだけです。