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
这个地方抛异常都会进入这个地方来处理,关于为何这么做,原理是什么,欢迎留言我解答