統一された例外処理関連ソリューション
@ControllerAdvice
:このクラスのステートメントは、コントロールエンハンサークラスを指定するために使用されます。RESTFull
スタイルデータに対して返される結果を宣言する場合@ExceptionHandler
は、アノテーション付きメソッドでプラスを宣言する必要があります。@ResponseBody
@RestControllerAdvice
:クラスの宣言は、クラスをコントロールエンハンサークラスとして指定するために使用されます。そしてRESTFull
、ステートメント@ExceptionHandler
と注釈付きメソッドを使用せずに、スタイルデータに対して返された結果を宣言します@ResponseBody
@ExceptionHandler
:宣言は、均一にインターセプトする必要がある例外を指定するためにメソッドで使用されます。例えば:@ExceptionHandler(value = Exception.class)
Controller
レイヤーでのグローバル例外の統一された処理
@ControllerAdvice
public class MyControllerAdvice {
// 全局异常捕捉处理
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map errorHandler(Exception ex) {
Map map = new HashMap();
map.put("code", 100);
map.put("msg", ex.getMessage());
return map;
}
// 拦截捕捉自定义异常 MyException.class
@ResponseBody
@ExceptionHandler(value = MyException.class)
public Map myErrorHandler(MyException ex) {
Map map = new HashMap();
map.put("code", ex.getCode());
map.put("msg", ex.getMsg());
return map;
}
}
異常層の@ControllerAdvice
統一処理のみのグローバル注釈付き例外に基づいていますController
。つまり、Controller
異常層のみをキャプチャし、service
他の異常レベルまたは層はキャプチャできません。ビジネスロジックが必要なときにカスタム例外をスローする必要がある場合がありますが、今回はビジネス例外クラスをカスタマイズする必要があります
カスタム例外クラスは、service
他の異常なレベルまたはレイヤーをキャプチャします
カスタム例外クラス
public class BusinessException extends RuntimeException {
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public BusinessException(Integer code,String message) {
super(message);
this.code = code;
}
}
メッセージクラス
public class ReturnMessage<T> {
private Integer code;//错误码
private String message;//提示信息
private T data;//返回具体内容
public ReturnMessage(Integer code, String message, T data) {
super();
this.code = code;
this.message = message;
this.data= data;
}
// 省略get and set方法
}
メッセージ処理ツール
public class ReturnMessageUtil {
// 无异常 请求成功并有具体内容返回
public static ReturnMessage<Object> sucess(Object object) {
ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);
return message;
}
// 无异常 请求成功并无具体内容返回
public static ReturnMessage<Object> sucess() {
ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);
return message;
}
// 自定义错误异常信息
public static ReturnMessage<Object> error(Integer code,String msg) {
ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);
return message;
}
}
統一された例外インターセプトクラス
@RestControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value = Exception.class)
public ReturnMessage<Object> handle(Exception exception) {
if(exception instanceof BusinessException) {
BusinessException businessException = (BusinessException)exception;
return ReturnMessageUtil.error(businessException.getCode(), businessException.getMessage());
}else {
logger.error("系统异常 {}",exception);
return ReturnMessageUtil.error(-1, "未知异常"+ exception.getMessage());
}
}
}
service
レイヤーまたは他のレイヤーで例外をスローします
throw new BusinessException(100, "这个是自定义异常!")
このとき、service
他の異常なレベルやレイヤーをキャプチャでき、クライアントはJSON
異常なデータのタイプに戻ります