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
這個地方拋異常都會進入這個地方來處理,關於爲何這麼做,原理是什麼,歡迎留言我解答