@ControllerAdviceと@ExceptionHandler注記を使用して例外を一括処理

8950 ワード

プログラムにはthrowによって投げ出されるExceptionが多数存在する.
統一処理の利点は,異なる異常に対応するcodeと記述を与えることができ,ログと組み合わせて異常を記録して誤りを調べることができることである.
統合例外処理には@Controller Adviceと@ExceptionHandler注記が必要です
@ControllerAdvice,Spring 3.2はControllerエンハンサーであり、controllerで@RequestMappingによって注釈される方法にいくつかの論理処理を加えることができる新しい注釈を提供します.最もよく使われるのは異常処理です.@ExceptionHandlerに合わせて使用する必要があります.例外をcontrollerに投げつけると、例外を統一的に処理し、返されるjsonフォーマットを規定したり、エラーページにジャンプしたりすることができます.
package com.liujx.handle;

import com.liujx.domain.Result;
import com.liujx.exception.GirlException;
import com.liujx.utils.ResultUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class ExceptionHandle {

    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e) {
        if (e instanceof GirlException) {
            GirlException girlException = (GirlException) e;
            return ResultUtil.error(girlException.getCode(), girlException.getMessage());
        }else{
            logger.error("【    】{}", e);
            return ResultUtil.error(-1, "    ");
        }
    }
}

カスタムプロジェクトのExceptionでは、デフォルトのexceptionクラスではmsgのみが受け入れられます.ここではcodeが追加され、さまざまな異常を区別します.
package com.liujx.exception;

import com.liujx.enums.ResultEnum;

public class GirlException extends RuntimeException {
    private Integer code;

    public GirlException(ResultEnum resultEnum) {
        super(resultEnum.getMsg());
        this.code = resultEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

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

注意:RuntimeExceptionの例外springは、トランザクションのロールバックを行います.