0

我将 JPA 与Guice Persist用于我的 GAE 项目,将Restlet用于 REST 接口。在引擎盖下,好的旧Hibernate提供了 JPA 服务。

在此处输入图像描述 在此处输入图像描述

这就像一个魅力,Guice 将必要的 JPA 部分注入到我的类中,EntityManager例如RestletServlet;

在此处输入图像描述

现在我想使用 aSessionInterceptor将创建/编辑时间戳和当前活动用户插入到我的实体中。在旧项目中,我使用HibernateUtil带有 ThreadLocal 变量的静态类来存储会话。在我的新项目中,我想用 Guice 解决这个问题。Guice 需要EntityManager在 my中注入一个,SessionInterceptor这样我就可以从数据库中加载当前的活动用户。

需要在SessionInterceptorHibernate 上下文中创建,并且不允许在启动后对其进行配置。因此我创建了一个SessionInterceptorFactory使用 Guice Injector 的。在persistence.xml

在此处输入图像描述

在此处输入图像描述

这行得通(是的,它很丑),我有一个SessionInterceptorGuice Injection。

在此处输入图像描述

但是当我尝试这段代码时;

在此处输入图像描述

[错误] 1) 没有绑定 javax.persistence.EntityManager 的实现。[错误] 在定位 com.google.inject.Provider 时 [错误]
为 com.ludus.server.hibernate.SessionInterceptor.(SessionInterceptor.java:20) 的第一个参数 [错误] 在定位 com.ludus.server.hibernate 时。会话拦截器

我需要将boundJPA(Hibernate)配置与SessionInterceptorGuice 中的()连接起来,就像我对RestletServlet.

谁能帮我解决这个 Guice 配置?

除此之外,当前SessionInterceptorFactory是“肮脏的 Guice hack”,是否有干净的 Guice 解决方案?

4

1 回答 1

0

问题是您正在创建一个全新的(和空的)注入器SessionInterceptorFactory,而您想要做的是将它挂接到您在其他地方拥有的主注入器中。

在尝试将 Guice 集成到依赖注入之前的工具中时,这是一个相当常见的问题:如果配置只让您选择提供“工厂类”而不是接受实例,那么您别无选择,只能通过通过静态变量引用。您可以通过使用线程本地来使它变得非常健壮,但这并不是很令人满意。

SessionFactory然而,在 Hibernate 的情况下,您可以通过使用 API 来构建而不是使用配置文件来整理它。您可以setInterceptorConfiguration构建您的SessionFactory. 你目前还没有展示你是如何创建这个的。

于 2017-07-23T19:30:10.567 回答