DataSourceBindAspect.java 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package jnpf.aop;
  2. import cn.dev33.satoken.context.SaHolder;
  3. import jnpf.base.UserInfo;
  4. import jnpf.config.ConfigValueUtil;
  5. import jnpf.database.util.NotTenantPluginHolder;
  6. import jnpf.database.util.TenantDataSourceUtil;
  7. import jnpf.util.StringUtil;
  8. import jnpf.util.TenantHolder;
  9. import jnpf.util.UserProvider;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.aspectj.lang.ProceedingJoinPoint;
  12. import org.aspectj.lang.annotation.Around;
  13. import org.aspectj.lang.annotation.Aspect;
  14. import org.aspectj.lang.annotation.Pointcut;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.core.annotation.Order;
  17. import org.springframework.stereotype.Component;
  18. /**
  19. *
  20. * @author JNPF开发平台组
  21. * @version V3.1.0
  22. * @copyright 引迈信息技术有限公司
  23. * @date 2021/3/15 17:12
  24. */
  25. @Slf4j
  26. @Aspect
  27. @Component
  28. @Order(1)
  29. public class DataSourceBindAspect {
  30. @Autowired
  31. private ConfigValueUtil configValueUtil;
  32. @Pointcut("(execution(* jnpf.*.controller.*.*(..)) || execution(* jnpf.controller.*.*(..))))")
  33. public void bindDataSource() {
  34. }
  35. /**
  36. * NoDataSourceBind 不需要绑定数据库的注解
  37. *
  38. * @param pjp
  39. * @return
  40. * @throws Throwable
  41. */
  42. @Around("bindDataSource() && !@annotation(jnpf.util.NoDataSourceBind)")
  43. public Object doAroundService(ProceedingJoinPoint pjp) throws Throwable {
  44. if (configValueUtil.isMultiTenancy()) {
  45. if(StringUtil.isEmpty(TenantHolder.getDatasourceId())){
  46. UserInfo userInfo = UserProvider.getUser();
  47. String url = null;
  48. try{
  49. url = SaHolder.getRequest().getRequestPath();
  50. }catch (Exception ee){ }
  51. log.error("租户" + userInfo.getTenantId() + "数据库不存在, URL: {}, TOKEN: {}", url, userInfo.getToken());
  52. return null;
  53. }
  54. return pjp.proceed();
  55. }
  56. Object obj = pjp.proceed();
  57. return obj;
  58. }
  59. @Around("bindDataSource() && @annotation(jnpf.util.NoDataSourceBind)")
  60. public Object doAroundService2(ProceedingJoinPoint pjp) throws Throwable {
  61. try{
  62. NotTenantPluginHolder.setNotSwitchAlwaysFlag();
  63. //Filter中提前设置租户信息, 不需要切库的方法进行清除切库
  64. TenantDataSourceUtil.clearLocalTenantInfo();
  65. return pjp.proceed();
  66. }finally {
  67. NotTenantPluginHolder.clearNotSwitchAlwaysFlag();
  68. }
  69. }
  70. }