如何在dropwizard中将http头作为hibernate筛选器传递?

如何在dropwizard中将http头作为hibernate筛选器传递?,hibernate,http-headers,jersey,dropwizard,hibernate-filters,Hibernate,Http Headers,Jersey,Dropwizard,Hibernate Filters,我正在开发一个多租户应用程序,使用Hibernate的@Filter注释按用户隐式过滤实体(如本博客所述:) 租户id在HTTP头中传递,该头被Jersey筛选器截获,并在Hibernate会话中使用以下代码设置: public class TenantFilter implements ContainerRequestFilter { private SessionFactory sessionFactory; public TenantFilter(SessionFacto

我正在开发一个多租户应用程序,使用Hibernate的@Filter注释按用户隐式过滤实体(如本博客所述:)

租户id在HTTP头中传递,该头被Jersey筛选器截获,并在Hibernate会话中使用以下代码设置:

public class TenantFilter implements ContainerRequestFilter {
    private SessionFactory sessionFactory;

    public TenantFilter(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        String tenantId = request.getHeaderValue("X-TENANT-ID");
        Session currentSession = sessionFactory.openSession();
        currentSession.enableFilter("tenant").setParameter("tenant_id", tenantId);
        return request;
    }
}
但是,DAO执行查询时未设置此筛选器参数,因为资源方法和筛选器中使用的hibernate会话不同(使用currentSession会导致会话不可用错误)


如何在与Dropwizard资源方法相同的事务上下文中将租户参数传递给Dropwizard中的Hibernate会话?Jersey筛选器不在同一事务上下文中执行,因为@UnitOfWork在资源方法上。

在运行中,db会话由框架本身处理。 与打开连接和设置当前线程打开的会话一样,使用@Transaction注释的任何人都只能在那里使用。 无法在代码中打开和关闭会话

您必须创建自己的JPAPlugin,就像play的jpa插件一样。 为每个请求创建一个会话,并将其与当前线程(Threadlocal)关联,并使用该会话,直到请求得到处理

在会话的初始创建过程中,您可以启用筛选器,在请求过程结束时,您可以禁用筛选器并关闭会话

这就是我们处理应用程序中的角色和权限的方式(使用方面)

请看下面的帖子,它将提供一些关于如何创建自己的db插件的想法

希望这能给你一些提示

SessionImplementor currentSession=((SessionImplementor)em(key.getDelegate());
currentSession.enableFilter(“租户”).setParameter(“租户id”,租户id)

嘿,我正在尝试做与您完全相同的事情——使用多租户数据体系结构实现Dropwizard。您是否找到了问题的解决方案?我最终实现了一个库,用于在dropwizard中将多租户添加到hibernate DAOs: