一、全局异常处理

  1. @Slf4j
  2. @ControllerAdvice
  3. public class GlobalExceptionHandler {
  4. /**
  5. * 处理自定义的业务异常
  6. *
  7. * @param req
  8. * @param e
  9. * @return
  10. */
  11. @ResponseBody
  12. @ExceptionHandler(value = BizException.class)
  13. public Message<String> bizExceptionHandler(HttpServletRequest req, BizException e) {
  14. log.error("发生业务异常!原因是:{}", e.getErrorMsg());
  15. if (!StringUtils.isNumeric(e.getMessage())) {
  16. return Message.error(e.getMessage());
  17. }
  18. return Message.error(I18nUtil.getMes(e.getErrorMsg()));
  19. }
  20. }

二、拦截器

  1. @Slf4j
  2. @Service
  3. public class PayLimitHandlerInterceptor implements HandlerInterceptor {
  4. @Autowired
  5. private SystemQuotaService systemQuotaService;
  6. @Value("${interceptor.doPayLimit:true}")
  7. private Boolean doPayLimit;
  8. //在header里用的字段是userid和accountid
  9. //地域信息header里也是regionid
  10. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  11. log.debug("校验是否有有付费版配额:{}", request.getRequestURI());
  12. if (doPayLimit
  13. && !isLimit(request, handler)) {
  14. log.warn("用户没有付费版配额,功能不可用:{},用户信息:{}",
  15. request.getRequestURI(),
  16. JSON.toJSONString(request.getSession().getAttribute(Const.SESSION_USER)));
  17. throw new NoPayQuotaException("用户没有付费版配额,功能不可用");
  18. }
  19. return Boolean.TRUE;
  20. }
  21. /**
  22. * 判断是否需要判断有效配额
  23. *
  24. * @return 需要返回true,否者返回false
  25. */
  26. private boolean isLimit(HttpServletRequest request, Object handler) {
  27. if (!(handler instanceof HandlerMethod)) {
  28. return Boolean.TRUE;
  29. }
  30. PayQuotaLimit payQuotaLimit = ((HandlerMethod) handler).getMethodAnnotation(PayQuotaLimit.class);
  31. if (Objects.nonNull(payQuotaLimit)
  32. && payQuotaLimit.limit()) {
  33. return systemQuotaService.isExistPayQuota(request.getHeader("accountid")) > 0;
  34. }
  35. return Boolean.TRUE;
  36. }
  37. }
  1. @Configuration
  2. public class InterceptorConfig implements WebMvcConfigurer {
  3. @Autowired
  4. private PayLimitHandlerInterceptor payLimitHandlerInterceptor;
  5. @Override
  6. public void addInterceptors(InterceptorRegistry registry) {
  7. registry.addInterceptor(payLimitHandlerInterceptor).addPathPatterns("/**");
  8. }
  9. }