自定义异常 你可以自定义普通的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
}