工作紀實_09-異常處理之過濾器

Spring的異常處理,通常,controller接口引發的業務異常,我們使用@ControllerAdvice註解一個異常類,然後配合使用@ExceptionHandler(XXXException.class)註解就可以處理
示例:

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
	/**
     * JSR303驗證規範的@Valid實體類註解校驗異常處理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Resp argumentDetailValidate(MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        Map<String, String> errorsMap = getErrorsMap(bindingResult);
        String errorMsg = String.join(";", errorsMap.values());
        Resp jsonResult = new Resp();
        jsonResult.setCode(BaseException.PARAM_MISSED);
        jsonResult.setMessage(errorMsg);
        return jsonResult;
    }
}

但是這種寫法只能攔截進入controller之後的異常,而filter異常,是在這之前,是無法被抓取的
所以需要做以下處理:
.新增一個類繼承BasicErrorController

package com.ecej.iot.mqtt.common.exception;

import com.ecej.iot.mqtt.common.util.BeanTransferUtil;
import com.ecej.platform.model.Resp;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * 基礎請求異常處理器,處理controller無法處理的異常,如filter
 *
 * @author liulei, [email protected]
 * @version 1.0
 */
@RestController
public class BasicHttpExceptionHandler extends BasicErrorController {

    public BasicHttpExceptionHandler() {
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }

    public BasicHttpExceptionHandler(ErrorAttributes errorAttributes, ErrorProperties errorProperties) {
        super(errorAttributes, errorProperties);
    }

    public BasicHttpExceptionHandler(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List<ErrorViewResolver> errorViewResolvers) {
        super(errorAttributes, errorProperties, errorViewResolvers);
    }

    @Override
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
        Resp resp = Resp.error(HttpStatus.OK.value(), String.valueOf(body.get("message")));
        Map<String, Object> objectMap = BeanTransferUtil.beanToMap(resp);
        return new ResponseEntity<>(objectMap, HttpStatus.OK);
    }
}

這樣就可以了,我們隨意的在filter這個地方拋異常都會進入這個地方來處理,關於爲何這麼做,原理是什麼,歡迎留言我解答

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章