一、全局异常处理
@Slf4j@ControllerAdvicepublic class GlobalExceptionHandler { /** * 处理自定义的业务异常 * * @param req * @param e * @return */ @ResponseBody @ExceptionHandler(value = BizException.class) public Message<String> bizExceptionHandler(HttpServletRequest req, BizException e) { log.error("发生业务异常!原因是:{}", e.getErrorMsg()); if (!StringUtils.isNumeric(e.getMessage())) { return Message.error(e.getMessage()); } return Message.error(I18nUtil.getMes(e.getErrorMsg())); }}
二、拦截器
@Slf4j@Servicepublic class PayLimitHandlerInterceptor implements HandlerInterceptor { @Autowired private SystemQuotaService systemQuotaService; @Value("${interceptor.doPayLimit:true}") private Boolean doPayLimit; //在header里用的字段是userid和accountid //地域信息header里也是regionid public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { log.debug("校验是否有有付费版配额:{}", request.getRequestURI()); if (doPayLimit && !isLimit(request, handler)) { log.warn("用户没有付费版配额,功能不可用:{},用户信息:{}", request.getRequestURI(), JSON.toJSONString(request.getSession().getAttribute(Const.SESSION_USER))); throw new NoPayQuotaException("用户没有付费版配额,功能不可用"); } return Boolean.TRUE; } /** * 判断是否需要判断有效配额 * * @return 需要返回true,否者返回false */ private boolean isLimit(HttpServletRequest request, Object handler) { if (!(handler instanceof HandlerMethod)) { return Boolean.TRUE; } PayQuotaLimit payQuotaLimit = ((HandlerMethod) handler).getMethodAnnotation(PayQuotaLimit.class); if (Objects.nonNull(payQuotaLimit) && payQuotaLimit.limit()) { return systemQuotaService.isExistPayQuota(request.getHeader("accountid")) > 0; } return Boolean.TRUE; }}
@Configurationpublic class InterceptorConfig implements WebMvcConfigurer { @Autowired private PayLimitHandlerInterceptor payLimitHandlerInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(payLimitHandlerInterceptor).addPathPatterns("/**"); }}