2.2K Star 16K Fork 9.6K

JEECG/JeecgBoot

 / 详情

多租户微服务之间调用找不到tenant-id(自定义页面)

已完成
创建于  
2022-06-04 09:41
版本号:

3.2.0

问题描述:

自建前端页面功能,当表未加入多租户时一切正常,但加入多租户后就看不到任何数据了。测试用代码生成器生成,数据查看是正常的(多租户),即当前租户有数据。是因为前端未加入"tenant-id"头吗?怎么加入呢

截图&代码:

友情提示(为了提高issue处理效率):

  • 未按格式要求发帖,会被直接删掉;
  • 请自己初判问题描述是否清楚,是否方便我们调查处理;
  • 针对问题请说明是Online在线功能(需说明用的主题模板),还是生成的代码功能;
  • 描述过于简单或模糊,导致无法处理的,会被直接删掉;

评论 (15)

flycatony 创建了任务
flycatony 修改了描述
flycatony 修改了描述
flycatony 修改了标题
展开全部操作日志

前端组件已经加了逻辑,自行参考

JEECG 任务状态待办的 修改为已完成

跟踪后发现不是前端未发出tenant-id,是微服务之间调用时未传递tenant-id.

  public List<SysRole> getAllRole() {
        List<SysRole> sysRoles= new ArrayList<>();
      System.out.println("租户请求头:"+SpringContextUtils.getHttpServletRequest().getHeader("tenant-id"));//值为1
        List<ComboModel> list =sysBaseApi.queryAllRole(null);//值为空
        for (ComboModel comboModel:list
        ) {
            SysRole interSysRole=new SysRole();
            interSysRole.setId(comboModel.getId());
            interSysRole.setRoleName(comboModel.getTitle());
            interSysRole.setRoleCode(comboModel.getRoleCode());
            sysRoles.add(interSysRole);
        }
        return sysRoles;
    }

sys_role表加了租户字段

private Integer tenantId;

跟踪SysBaseApiImpl中的值为空。

	public List<ComboModel> queryAllRole() {
		System.out.println("租户请求头:"+ SpringContextUtils.getHttpServletRequest().getHeader("tenant-id"));//空值
		List<ComboModel> list = new ArrayList<ComboModel>();
		List<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());
		for(SysRole role : roleList){
			ComboModel model = new ComboModel();
			model.setTitle(role.getRoleName());
			model.setId(role.getId());
			list.add(model);
			System.out.println("角色:"+ role.toString());//空值
		}

		return list;
	}

微服务间调用这样不行吗?

传递是前端代码

A是System,B是微服务,C也是微服务。
前端调用B微服务,B后端直接调用A的角色组、C的基础业务模块[***Cloud-Api],这时B不需要额外提供tenant-id的头吗?前端的tenantId会自动传递吗?

微服务直接调用,你得自己看看header传递这么多次是否带有租户ID

能给个“如何在微服务中传递租户的请求”示例吗?

调用前tenantId是1

 public List<SysRole> getAllRole() {
        List<SysRole> sysRoles= new ArrayList<>();
      System.out.println("租户请求头:"+SpringContextUtils.getHttpServletRequest().getHeader("tenant-id"));//值为1
         **List<ComboModel> list =sysBaseApi.queryAllRole(null);//值为空** 
        for (ComboModel comboModel:list
        ) {
            SysRole interSysRole=new SysRole();
            interSysRole.setId(comboModel.getId());
            interSysRole.setRoleName(comboModel.getTitle());
            interSysRole.setRoleCode(comboModel.getRoleCode());
            sysRoles.add(interSysRole);
        }
        return sysRoles;
    }

但在sysBaseApi.queryAllRole(null)中的tenantId值就变为空了。

public List<ComboModel> queryAllRole() {
		System.out.println("租户请求头:"+ SpringContextUtils.getHttpServletRequest().getHeader("tenant-id"));//空值
		List<ComboModel> list = new ArrayList<ComboModel>();
		List<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());
		for(SysRole role : roleList){
			ComboModel model = new ComboModel();
			model.setTitle(role.getRoleName());
			model.setId(role.getId());
			list.add(model);
			System.out.println("角色:"+ role.toString());//空值
		}

		return list;
	}

就是执行了sysBaseApi.queryAllRole(null)这一步骤未带入tenantId.应该怎么做呢?
谢谢!!!

List<ComboModel> list =sysBaseApi.queryAllRole(null);
是微服务当用方式,还是普通的常规调用

引用的jeecg-system-cloud-api,想实现微服务调用

jeecg-boot-starter\jeecg-boot-starter-cloud\src\main\java\org\jeecg\config\FeignConfig.java

改下这个类,加入租户传递逻辑,参考下token

JEECG 任务状态已完成 修改为待办的

我参照着改成这样了

 if (null != attributes) {
                HttpServletRequest request = attributes.getRequest();
                log.debug("Feign request: {}", request.getRequestURI());
                // 将token信息放入header中
                String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
                if(token==null || "".equals(token)){
                    token = request.getParameter("token");
                }
                log.info("Feign Login Request token: {}", token);
                requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token);
                // 将tenantId信息放入header中
                String tenantId = request.getHeader(CommonConstant.TENANT_ID);
                if(tenantId==null || "".equals(tenantId)){
                    tenantId = request.getParameter("tenant-id");
                }
                log.info("Feign Login Request tenantId: {}", tenantId);
                requestTemplate.header(CommonConstant.TENANT_ID, tenantId);
            }else{
                String token = UserTokenContext.getToken();
                log.info("Feign no Login token: {}", token);
                requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token);

                String tenantId = TenantContext.getTenant();
                log.info("Feign no Login tenantId: {}", tenantId);
                requestTemplate.header(CommonConstant.TENANT_ID, tenantId);
            }

这样可以了,非常感谢!!!

切换成微服务多租户模式后,online表单在线开发的功能测试不能用了怎么办?

404
抱歉,你访问的页面不存在或无权访问

tenant-id问题已修改,online问题未知

JEECG 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
57093 jeecg 1662000782 5727315 lifuwang 1651062662 469422 tygo 1607052856
Java
1
https://gitee.com/jeecg/JeecgBoot.git
git@gitee.com:jeecg/JeecgBoot.git
jeecg
JeecgBoot
JeecgBoot

搜索帮助

Dd8185d8 1850385 E526c682 1850385