最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus忽略多租戶隔離自定義注解

 更新時間:2024年12月13日 09:44:28   作者:沸羊羊開發(fā)  
本文主要介紹了MyBatis-Plus忽略多租戶隔離自定義注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

微服務(wù)項(xiàng)目中由于默認(rèn)開啟了租戶隔離,但是有些情況下需要個別方法不啟用。

為了實(shí)現(xiàn)這個目標(biāo)自定義了一個忽略租戶隔離的注解:

@IgnoreTenant

將他加在方法上即可,例如:

    @IgnoreTenant
    public CrmSmsTemplate getTemplateByCodeAndTenandtId(String code, Integer tenantId) {
        return crmSmsTemplateMapper.selectOne(new QueryWrapper<CrmSmsTemplate>().eq("code", code).eq("tenant_id", tenantId));
    }

實(shí)現(xiàn)步驟:

1.首先定義MybatisPlus的配置類創(chuàng)建一個攔截器MybatisPlusInterceptor

將MybatisPlusSaasConfig中的mybatisPlusInterceptor方法修改

@Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                String tenantId = TenantContext.getTenant();
                //如果通過線程獲取租戶ID為空,則通過當(dāng)前請求的request獲取租戶(shiro排除攔截器的請求會獲取不到租戶ID)
                if(oConvertUtils.isEmpty(tenantId)){
                    try {
                        tenantId = TokenUtils.getTenantIdByRequest(SpringContextUtils.getHttpServletRequest());
                    } catch (Exception e) {
                        //e.printStackTrace();
                    }
                }
                if(oConvertUtils.isEmpty(tenantId)){
                    tenantId = "0";
                }
                return new LongValue(tenantId);
            }

            @Override
            public String getTenantIdColumn(){
                return TenantConstant.TENANT_ID_TABLE;
            }

            // 返回 true 表示不走租戶邏輯
            @Override
            public boolean ignoreTable(String tableName) {
                for(String temp: TENANT_TABLE){
                    if(temp.equalsIgnoreCase(tableName)){
                        if (Objects.nonNull(MybatisTenantContext.get())){
                            return MybatisTenantContext.get();
                        }
                        return false;
                    }
                }
                return true;
            }
            /*@Override
            public boolean ignoreTable(String tableName) {
                if (Objects.nonNull(MybatisTenantContext.get())){
                    return MybatisTenantContext.get();
                }
                return true;
            }*/
        }));
        //update-begin-author:zyf date:20220425 for:【VUEN-606】注入動態(tài)表名適配攔截器解決多表名問題
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor());
        //update-end-author:zyf date:20220425 for:【VUEN-606】注入動態(tài)表名適配攔截器解決多表名問題
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //【jeecg-boot/issues/3847】增加@Version樂觀鎖支持 
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }

2,定義一個ThreadLocal本地線程變量 MybatisTenantContext用于維護(hù)是否開啟租戶隔離變量

package org.jeecg.config.mybatis;

public class MybatisTenantContext {
    private static final ThreadLocal<Boolean> TENANT_CONTEXT_THREAD_LOCAL = new ThreadLocal<>();

    public static Boolean get() {
        return TENANT_CONTEXT_THREAD_LOCAL.get();
    }

    public static void set(boolean isIgnore){
        TENANT_CONTEXT_THREAD_LOCAL.set(isIgnore);
    }

    public static void clear(){
        TENANT_CONTEXT_THREAD_LOCAL.remove();
    }
}

3.自定義注解

package org.jeecg.config.filter;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface IgnoreTenant {

    /**
     * true為不做租戶隔離 false為做租戶隔離
     * @return
     */
    boolean isIgnore() default true;
}

4.注解切面類

ps:如果方法或者類上有其他注解用到租戶隔離的,如:日志注解,字典翻譯注解在point.proceed()后執(zhí)行邏輯。需要注意切面類的執(zhí)行順序,一定要保證TenantIgnoreAspect 先執(zhí)行,不然其它注解還是會有租戶隔離的情況??梢栽赥enantIgnoreAspect 切面類加上@Order(Integer.MIN_VALUE)注解 保證執(zhí)行順序

package org.jeecg.config.filter;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.config.mybatis.MybatisTenantContext;
import org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Objects;

@Aspect
@Slf4j
@Component
@Order(Integer.MIN_VALUE)
public class TenantIgnoreAspect {
    /**
     * 切入點(diǎn)
     */
    @Pointcut("@within(org.jeecg.config.filter.IgnoreTenant) ||@annotation(org.jeecg.config.filter.IgnoreTenant)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        try {
            Class<?> targetClass = point.getTarget().getClass();
            IgnoreTenant classIgnoreTenant = targetClass.getAnnotation(IgnoreTenant.class);
            MethodSignature signature = (MethodSignature) point.getSignature();
            Method method = signature.getMethod();
            IgnoreTenant methodIgnoreTenant = method.getAnnotation(IgnoreTenant.class);

            //判斷類上是否有注解
            boolean isClassAnnotated = AnnotationUtils.isAnnotationDeclaredLocally(IgnoreTenant.class, targetClass);
            //判斷方法上是否有注解
            boolean isMethodAnnotated = Objects.nonNull(methodIgnoreTenant);

            //如果類上有
            if (isClassAnnotated) {
                MybatisTenantContext.set(classIgnoreTenant.isIgnore());
            }
            //如果方法上有 以方法上的為主
            if (isMethodAnnotated) {
                MybatisTenantContext.set(methodIgnoreTenant.isIgnore());
            }
            Object result = point.proceed();
            return result;
        } finally {
            MybatisTenantContext.clear();
        }
    }
}

 到此為止就可以使用注解:@IgnoreTenant

補(bǔ)充:如果一個方法中有多個查詢,但是只有特定查詢需要忽略租戶隔離,可以使用下面的方式

@Service
public class DemoService {

    public List<String> demoList(String name){
        try {
            MybatisTenantContext.set(true);
            this.listByName(name);
            return this.list();
        }finally {
            MybatisTenantContext.clear();
        }
    }
}

以上代碼是手動維護(hù)本地線程變量 MybatisTenantContext,不可以使用注解,使用完一定要記得clear。更多相關(guān)MyBatis-Plus忽略多租戶隔離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java語言實(shí)現(xiàn)Blowfish加密算法完整代碼分享

    Java語言實(shí)現(xiàn)Blowfish加密算法完整代碼分享

    這篇文章主要介紹了Java語言實(shí)現(xiàn)Blowfish加密算法完整代碼分享,簡單介紹了blowfish加密算法,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • 詳解Spring中REQUIRED事務(wù)的回滾機(jī)制詳解

    詳解Spring中REQUIRED事務(wù)的回滾機(jī)制詳解

    在Spring的事務(wù)管理中,REQUIRED是最常用也是默認(rèn)的事務(wù)傳播屬性,本文就來詳細(xì)的介紹一下Spring中REQUIRED事務(wù)的回滾機(jī)制,感興趣的可以了解一下
    2025-09-09
  • RocketMQ?Broker如何保存消息源碼解析

    RocketMQ?Broker如何保存消息源碼解析

    這篇文章主要為大家介紹了RocketMQ源碼分析Broker如何保存消息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 詳解SpringBoot如何創(chuàng)建自定義Starter

    詳解SpringBoot如何創(chuàng)建自定義Starter

    Spring Boot的自動配置機(jī)制為開發(fā)人員提供了一種輕松集成和配置各種功能的便捷方式,本文將深入探討在Spring Boot中如何創(chuàng)建自定義Starter,為構(gòu)建模塊化且易維護(hù)的應(yīng)用提供有力的支持,需要的朋友可以參考下
    2024-02-02
  • Java instanceof和getClass()區(qū)別實(shí)例解析

    Java instanceof和getClass()區(qū)別實(shí)例解析

    這篇文章主要介紹了Java instanceof和getClass()區(qū)別實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • MyBatis中XML映射器的實(shí)現(xiàn)

    MyBatis中XML映射器的實(shí)現(xiàn)

    MyBatis的真正強(qiáng)大在于它的語句映射,映射器的XML文件就顯得相對簡單,本文主要介紹了MyBatis中XML映射器的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot基于SpringSecurity表單登錄和權(quán)限驗(yàn)證的示例

    SpringBoot基于SpringSecurity表單登錄和權(quán)限驗(yàn)證的示例

    這篇文章主要介紹了SpringBoot基于SpringSecurity表單登錄和權(quán)限驗(yàn)證的示例。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java單例模式的應(yīng)用示例

    Java單例模式的應(yīng)用示例

    這篇文章主要介紹了Java單例模式的應(yīng)用示例,需要的朋友可以參考下
    2014-02-02
  • Spring如何使用xml創(chuàng)建bean對象

    Spring如何使用xml創(chuàng)建bean對象

    這篇文章主要介紹了Spring如何使用xml創(chuàng)建bean對象,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Mybatis?如何開啟控制臺打印sql語句

    Mybatis?如何開啟控制臺打印sql語句

    這篇文章主要介紹了Mybatis?如何開啟控制臺打印sql語句問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

迁西县| 正蓝旗| 延长县| 衡山县| 兴安县| 稷山县| 辉南县| 平南县| 黔江区| 汝城县| 延吉市| 祁阳县| 湘西| 新兴县| 东莞市| 十堰市| 泰州市| 陆河县| 屏东县| 北辰区| 搜索| 光泽县| 金川县| 馆陶县| 蓬安县| 邹平县| 张掖市| 长乐市| 三河市| 年辖:市辖区| 磐安县| 黄大仙区| 太白县| 宜丰县| 玛曲县| 建德市| 炎陵县| 张家港市| 大英县| 华容县| 五台县|