ホームページ  >  記事  >  Java  >  SpringBoot で統合例外処理を実装する方法

SpringBoot で統合例外処理を実装する方法

WBOY
WBOY転載
2023-05-10 22:01:041155ブラウズ

シナリオ: 例外処理の場合、私たちの元のアプローチは、通常、最も外側の層で例外をキャプチャすることです。たとえば、コントローラーで

@Controller
public class HelloController {
 
  private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
 
  @GetMapping(value = "/hello")
  @ResponseBody
  public Result hello() {
    try {
      //TODO 具体的逻辑省略……
    } catch (Exception e) {
      logger.error("hello接口异常={}", e);
      return ResultUtil.success(-1, "system error", null);
    }
    return ResultUtil.success(0, "success", null);
  }
}

これでもいくつかの問題は解決できますが、解決することはできません。自己指定例外に対するグローバル統一例外処理を導入すると、コードが大幅に改善され、冗長コードの生成が削減されます。

カスタム例外クラス: Exception ではなく RuntimeException から継承する必要があることに注意してください。Exception から継承した場合、カスタム例外がスローされたときに Spring トランザクションはロールバックされません。

public class GlobalException extends RuntimeException {
 
  private Integer code; //因为我需要将异常信息也返回给接口中,所以添加code区分
 
  public GlobalException(Integer code,String message) {
    super(message);  //把自定义的message传递个异常父类
    this.code = code;
  }
 
  public Integer getCode() {
    return code;
  }
 
  public void setCode(Integer code) {
    this.code = code;
  }
}

Customization 統合例外ハンドラー: 2 つのより重要なアノテーション @ControllerAdvice と @ExceptionHandler

@ControllerAdvice
public class ExceptionHandle {
 
  @ResponseBody  //因为我需要将抛出的异常返回给接口,所以加上此注解
  @ExceptionHandler
  public Result handle(Exception e) {
    if (e instanceof GlobalException) {
      GlobalException ge = (GlobalException) e;
      return ResultUtil.success1(ge.getCode(), ge.getMessage());
    }
    return ResultUtil.success1(-1, "system error!");
  }
 
}

test 用のテスト クラスを作成します

@GetMapping(value = "/hello1")
@ResponseBody
public Result hello(@RequestParam(value = "age", defaultValue = "50", required = false) Integer age) throws GlobalException {
  if (age  50) {
    throw new GlobalException(ConstantEnum.MORE50.getCode(), ConstantEnum.MORE50.getMsg());
  } else {
    return ResultUtil.success1(0, "success");
  }
}

コードとメッセージを ConstantEnum In にカプセル化します列挙型は、統合メンテナンスに便利です。

public enum ConstantEnum {
 
  ERROR(-1, "system error!"),
  SUCCESS(100, "success"),
  LESS10(101, "自定义异常信息-我小于10岁"),
  MORE50(5001, "自定义异常信息-我大于50岁");
 
  private Integer code;
  private String msg;
 
  public Integer getCode() {
    return code;
  }
 
  public String getMsg() {
    return msg;
  }
 
  ConstantEnum(Integer code, String msg) {
    this.code = code;
    this.msg = msg;
  }
}

SpringBoot で統合例外処理を実装する方法

以上がSpringBoot で統合例外処理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。