Spring的统一异常处理ExceptionHandler

921 阅读1分钟

1.对个Controller的异常处理

某个Controller

    @ExceptionHandler(MissingServletRequestParameterException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void processMethod(MissingServletRequestParameterException ex,HttpServletRequest request ,HttpServletResponse response) throws IOException {
        System.out.println("抛异常了!"+ex.getLocalizedMessage());
        logger.error("抛异常了!"+ex.getLocalizedMessage());
        response.getWriter().printf(ex.getMessage());
        response.flushBuffer();
    }

这样,如果当前controller抛出MissingServletRequestParameterException异常,会被方法捕获,并执行方法体 @ExceptionHandler(Class<? extends Throwable>[] value() default {})可以预定义多个异常

2.如果想在所有的Controller里面统一处理异常的话,可以用@ControllerAdvice来创建一个专门处理的类。

WebExceptionHandler.class

ExceptionConfig.class

exception.properties

@ControllerAdvice
@ResponseBody
public class WebExceptionHandler {

    @Autowired
    private ExceptionConfig exceptionConfig;

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Result<String> globalException(HttpServletRequest request, Throwable ex) {
        Pair<Integer,String> pair = exceptionConfig.getCodeMessage(ex.getClass().getSimpleName());
        if(pair != null) {
            return Result.error(pair.getKey(), pair.getValue());
        }else {
            return Result.error(400, ex.getClass().getName());
        }
    }

}
@Configuration
@Data
@ConfigurationProperties
@PropertySource("classpath:exception.properties")
public class ExceptionConfig {

    private Map<String, String> exception = new HashMap<>(4);

    private Map<String, Pair<Integer, String>> cache = new HashMap<>(4);

    public Pair<Integer, String> getCodeMessage(String name){
        if(cache.containsKey(name)){
            return cache.get(name);
        }else {
            String value = exception.get(name);
            if (value != null) {
                String[] split = value.split(":");
                Integer code = Integer.valueOf(split[0]);
                Pair<Integer, String> pair = ImmutablePair.of(code, split[1]);
                cache.put(name, pair);
                return pair;
            }
        }
        return null;
    }
}

exception.properties

exception.ChargingNetworkNonexistException=10000:充电网络handle对象不存在
exception.UserLockException=10001:账号已被锁定,请联系管理员!
exception.DeleteErrorException=10002:删除失败,目标数据不存在