先来看一下正常的 Mybatis-plus 多租户 获取 租户id
@Override
public Expression getTenantId() {
User user = UserUtils.getUser();
return new StringValue(user.getCorp().getId());
}
因为游客没有登录的 token, 所以, 我们需要通过请求头(header) 或者请求参数 进行租户id 的传递
在springboot 中, 我们可以使用 RequestContextHolder.getRequestAttributes() 来获取request信息
public static String getCorpId() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
Assert.notNull(servletRequestAttributes, "header 获取异常");
// 获取请求头中的商户id
String corpId = servletRequestAttributes.getRequest().getHeader("corpId");
// 获取请求参数中的商户id
// String corpId = request.getParameter("corpId");
Assert.notNull(corpId, "商户信息获取失败, 请切换商户");
return corpId;
}
拿到了租户id
我们修改 getTenantId() 如下
@Override
public Expression getTenantId() {
User user = UserUtils.getUser();
if (Objects.isNull(user) || user.getCorpId() == null) {
String corpId = getCorpId();
return new StringValue(corpId);
} else {
return new StringValue(user.getCorpId().getId());
}
}
需要注意的是:
- RequestContextHolder.getRequestAttributes() 不适用于多线程中, 如果需要 请以参数形式传递, 否则可能出现获取不到信息的情况