spring boot中的自定义异常和异常处理器

自定义异常 你可以自定义普通的Exception,也可以自定义RuntimeException。

区别:https://www.cnblogs.com/sishuiliuyun/p/4421516.html

下面的例子比较简单,你也可以在你自定义的exception中写你的逻辑。

自定义RuntimeException:

异常处理器 @ControllerAdvice拦截异常,

@ExceptionHandler指定处理哪种异常(可指定多个),

@ResponseStatus指定返回的http状态码(具体可查看HttpStatus这个类),

@ControllerAdvice+@ResponseBody可换成@RestControllerAdvice. 

/**
 * 自定义参数异常
 */
public class ParamException extends RuntimeException {

  public ParamException() {
  }

  public ParamException(String message) {
    super(message);
  }

  public ParamException(Throwable cause) {
    super(cause);
  }

  public ParamException(String message, Throwable cause) {
    super(message, cause);
  }

}

自定义异常处理器:

/**
 * 异常处理器
 *
 * @author
 */
@RestControllerAdvice
@Slf4j
public class YYKExceptionHandler {

  
    @ExceptionHandler(GlobalException.class)
    public ResultObject handGlobalExcepton(GlobalException e) {
        return ResultObject.error(e.getErrorCode());
    }

    @ExceptionHandler(ExcelException.class)
    public ResultObject handExcelException(ExcelException e) {
        return ResultObject.error(e.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResultObject validException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        StringBuffer errorMesssage = new StringBuffer("参数错误: ");

        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            errorMesssage.append(fieldError.getDefaultMessage() + "\n");
        }

        return ResultObject.error(errorMesssage.toString());
    }

    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public ResultObject requestMethod(HttpRequestMethodNotSupportedException e) {
        return ResultObject.error("我俩讲话方式不对啦! 你用【" + e.getMethod() + "】我就不听~");
    }

    @ExceptionHandler(LoginException.class)
    public ResultObject handleLoginException(LoginException e) {
        return ResultObject.error(e.getMessage());
    }

    @ExceptionHandler(ParameterTypeException.class)
    public ResultObject ParameterTypeException(ParameterTypeException e) {
        return ResultObject.error(e.getMessage());
    }

    @ExceptionHandler(EmptyException.class)
    public ResultObject runtimeExceptionHandler(EmptyException e) {
        return ResultObject.successWithPage(Collections.emptyList());
    }

    @ExceptionHandler(ParamException.class)
    public ResultObject runtimeExceptionHandler(ParamException e) {
        return ResultObject.error(e.getMessage());
    }

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResultObject invalidFormatException(HttpMessageNotReadableException e) {
        return ResultObject.error("参数格式异常");
    }

    @ExceptionHandler(Exception.class)
    public ResultObject handleException(Exception e) {
        log.error(e.getMessage(), e);
        return ResultObject.error();
    }
}

前端返回包装类

/**
 * 返回数据
 *
 * @author
 *
 */
@Slf4j
public class ResultObject extends HashMap<String, Object> {
	/**提示消息
	 */
	private static final String MSG = "msg";
	/**结果码
	 */
	private static final String CODE = "code";
	/**数据实体
	 */
	private static final String DATA = "data";
	private static final long serialVersionUID = 1L;

	private ResultObject() {
		put(CODE, 0);
	}

	public static ResultObject error() {
		try{
			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
		}catch (NoTransactionException e){
		}
		return error(HttpStatus.INTERNAL_SERVER_ERROR.value(), "服务器开小差了,请联系管理员");
	}

	/**
	 * @param code
	 * @param msg
	 * @return
	 */
	public static ResultObject error(int code, String msg) {
	    try{
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }catch (NoTransactionException e){
        }
		ResultObject result = new ResultObject();
		result.setCode(code);
		result.setMsg(msg);
		return result;
	}

	/**
	 * @param msg
	 * @return
	 */
	public static ResultObject error(String msg) {
		return error(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg);
	}

	/**
	 * @param errorCode
	 * @return
	 */
	public static ResultObject error(ErrorCode errorCode) {
		return fromErrorCode(errorCode);
	}

	private static ResultObject fromErrorCode(ErrorCode errorCode) {
		ResultObject result = new ResultObject();
		result.setCode(errorCode.getCode());
		result.setMsg(errorCode.getMsg());
		return result;
	}

	public static ResultObject success() {
		return fromErrorCode(ErrorCode.SUCCESS);
	}
	
	public static <T> ResultObject success(T data) {
		ResultObject success = success();
		success.setData(data);
		return success;
	}
	
	public static ResultObject success(Page page){
		ResultObject success = ResultObject.success();
		success.put("totalCount", page.getTotal());
		success.put("totalPages", page.getPages());
		success.put("data",page.getList());
		return success;
	}

	public static ResultObject successs(Map<String, Object> map) {
		ResultObject r = new ResultObject();
		r.putAll(map);
		return r;
	}

	public void setCode(int code) {
		put(CODE, code);
	}

	public void setMsg(String msg) {
		put(MSG, msg);
	}

	public void setData(Object msg) {
		put(DATA, msg);
	}
	public boolean isSuccess() {
		return "0".equals(Optional.ofNullable(get(CODE)).orElse("").toString());
	}

	/** pagerHelp 分页
	 * @param pagerList
	 * @return
	 */
	public static final  <T> ResultObject successWithPage(List<T> pagerList) {
		ResultObject successs = new ResultObject();
		PageInfo<?> pageInfo= new PageInfo<T>(pagerList);
		successs.put(YykConstants.TOTAL_COUNT, pageInfo.getTotal());
		successs.put(YykConstants.TOTAL_PAGE, pageInfo.getPages());
		successs.put(DATA,pagerList);

		return successs;
	}

}

 

注解@ControllerAdvice的类可以拥有@ExceptionHandler, @InitBinder或 @ModelAttribute注解的方法,并且这些方法会被应用到控制器类层次的所有@RequestMapping方法上

@ControllerAdvice
public class BaseController {
 
    public final String error = "ERROR";
 
    /**
     * 1.追加转换器
     * 2.追加校验器
     *
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        System.out.println("initBinder");
        //统一日期处理
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
        //追加校验器
        binder.addValidators(personValidator);
    }
 
 
    /**
     * 异常处理
     *
     * @return
     */
    @ExceptionHandler({Exception.class})
    @ResponseBody
    public Object handException() {
        return error;
    }
 
//    @ModelAttribute
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值