package com.sinata.appointment.common; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; import com.sinata.appointment.constants.HttpBizCode; import com.sinata.appointment.exception.BizException; import cn.dev33.satoken.exception.SaTokenException; import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(BizException.class) public Result handleBiz(BizException e) { return ResultUtil.error(e.getCode(), e.getMessage()); } @ExceptionHandler({MethodArgumentNotValidException.class, ConstraintViolationException.class}) public Result handleValidation(Exception e) { String msg = e instanceof MethodArgumentNotValidException mn ? mn.getBindingResult().getFieldError() != null ? mn.getBindingResult().getFieldError().getDefaultMessage() : e.getMessage() : e.getMessage(); return ResultUtil.error(HttpBizCode.BAD_REQUEST, msg != null ? msg : "参数错误"); } @ExceptionHandler(SaTokenException.class) public Result handleSaToken(SaTokenException e) { log.error("satoken error", e); if (e instanceof NotPermissionException){ return ResultUtil.error(HttpBizCode.FORBIDDEN, "无权限访问"); } if (e instanceof NotLoginException notLogin && NotLoginException.KICK_OUT.equals(notLogin.getType())) { return ResultUtil.error(HttpBizCode.UNAUTHORIZED, "账号已被禁用,请重新登录"); } return ResultUtil.error(HttpBizCode.UNAUTHORIZED, "账号信息已过期,请重新登录"); } @ExceptionHandler(Exception.class) public Result handleOther(Exception e) { log.error("Unhandled error", e); return ResultUtil.error(HttpBizCode.INTERNAL_ERROR, "系统繁忙,请稍后重试"); } }