当前位置: 首页 > 知识库问答 >
问题:

没有默认租户的Spring Boot多租户

景正文
2023-03-14

我们正面临着解决这个问题的艰难时刻!我们正在尝试在不使用默认租户的情况下为Spring Boot服务使用MTA。这意味着当当前上下文中没有租户时,我们希望从我们的CurrentTenantIdentifierResolver实现返回null。这在我们用JavaEE+Hibernate+Deltaspike数据构建的其他服务中运行良好,但在Spring服务启动时失败。

异常消息如下:“由:org.hibernate.hibernateException:SessionFactory配置为多租户,但未指定租户标识符”

问题似乎是存储库工厂试图在启动期间为crud存储库创建/的实例/bean,而租户不存在(也不会存在):在org.springframework.data.jpa.repository.support.jparepositoryfactory。(jparepositoryfactory.java:59)~[spring-data-jpa-1.11.3.release.jar:na]

因此,我们的问题是,是否有人对此有解决方案,因为我们希望避免使用默认租户。对于我们来说,使用默认值似乎容易出错,并且会隐藏非法的应用程序状态。

我们使用的是spring boot父版本1.5.3.发行版。

如果重要的话:我们的服务是简单的JSON RPC服务,租户将出现在传入的http请求中,并由mvc拦截器设置在本地线程上。在JavaEE世界中,我们使用webfilters来实现这一点。

非常感谢你的帮助!

共有1个答案

党宇定
2023-03-14

事实上,我没有尝试过这种方法。

异常最初是在代码中抛出的

protected AbstractSessionImpl(SessionFactoryImpl factory, String tenantIdentifier) {
    this.factory = factory;
    this.tenantIdentifier = tenantIdentifier;
    if ( MultiTenancyStrategy.NONE == factory.getSettings().getMultiTenancyStrategy() ) {
        if ( tenantIdentifier != null ) {
            throw new HibernateException( "SessionFactory was not configured for multi-tenancy" );
        }
    }
    else {
        if ( tenantIdentifier == null ) {
            throw new HibernateException( "SessionFactory configured for multi-tenancy, but no tenant identifier specified" );
        }
    }
}

建议替换hibernate session factory(参见示例),如果当前上下文中没有租户,则返回MultiTenancyStrategy.None

 类似资料:
  • 目前为止,我们已经让用户页面在多租户风格下工作。为使它工作,我们看起来并没有做太多的变化。但请记住,我们正在对一个原来不是多租户的系统作修改。 让我们在 Roles 表应用类似的原则。 再一次,一个租户的用户在不能查看或修改其他租户的角色,每个租户的用户是相互独立工作的。 我们先在 RoleRow.cs 添加 TenantId 属性: namespace MultiTenancy.Administ

  • 问题内容: Tl; dr:有没有方法可以覆盖默认行为? 在我的django项目中,我有很多网址,例如 允许使用以下网址 这样,我便可以使用自定义中间件来修改请求,以包括基于使用我的网站的公司的一些特定详细信息 这一切工作正常,除了当Django试图破译与完整路径和… 它似乎作为正则表达式的默认匹配返回。由于该方法具有用于映射到的转义映射 该标签我已经能够覆盖更换正确的公司名称,我想知道是否有类似的

  • 我们正在开发一个多租户应用程序。在体系结构方面,我们为业务逻辑设计了共享中间层,为数据持久性设计了每个租户一个数据库。也就是说,业务层将与每个租户的数据库服务器建立一组连接(连接池)。这意味着应用程序为每个租户维护单独的连接池。如果我们预计约有5000个租户,那么这个解决方案需要高资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。 我们已经通过保持公共连接池解决了这个问

  • 我使用和配置了hibernate的多租户。我还编写了一个过滤器,截取url并确定谁是租户。 我有几个问题/困惑。 > 这种方法合适吗?我也想过在用户会话中存储租户标识,但我认为这不是一个好主意。(在过去,我在会话中存储东西时遇到过问题,在某些情况下有其局限性)。 我对这两种方法感到困惑,请问还有第三种方法吗。对于多租户,我选择了hibernate的策略。

  • 由于我们现在有一个行为处理仓储的详细信息,我们只需在行(rows)实现 IMultiTenantRow 接口并添加 TenantId 属性。 从 SupplierRow.cs 开始: namespace MultiTenancy.Northwind.Entities { //... public sealed class SupplierRow : Row, IId

  • 我正在构建一个应用程序,它应该服务于多个租户,并存储他们非常敏感的数据。每个租户都有多个用户。我的后端堆栈是用spring boot Hibernate5构建的。我希望hibernate处理多租户问题,所以我有两个问题要问专家: 如果我使用的是每租户模式范式,如何在登录时将用户名与租户关联?每个租户都有自己的用户表,那么我如何知道用户名属于哪个租户呢? 在注册时,什么是正确的方法来动态创建新模式?