3.2.0
自建前端页面功能,当表未加入多租户时一切正常,但加入多租户后就看不到任何数据了。测试用代码生成器生成,数据查看是正常的(多租户),即当前租户有数据。是因为前端未加入"tenant-id"头吗?怎么加入呢
前端组件已经加了逻辑,自行参考
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
跟踪后发现不是前端未发出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
我参照着改成这样了
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问题未知
登录 后才可以发表评论