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

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