一、全局异常处理
@Slf4j
@ControllerAdvice
public 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
@Service
public 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;
}
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private PayLimitHandlerInterceptor payLimitHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(payLimitHandlerInterceptor).addPathPatterns("/**");
}
}