【发布时间】:2015-07-14 17:23:59
【问题描述】:
我创建了一个扩展 jersey 的 ContainerRequestFilter 的服务器过滤器,我想在这个自定义过滤器中注入一个 (EntityManager) 对象。为此,我创建了一个实现 jersey 的 hk2.api.Factory 和配置的工厂。此设置成功地将对象注入到资源中,但是无法将对象注入到过滤器中。
有谁知道如何配置 jersey 以将对象注入过滤器?
原始错误:
一个 MultiException 有 3 个异常。他们是:
- java.lang.IllegalStateException:不在请求范围内。
- java.lang.IllegalArgumentException: 在尝试解决 co.example.filters.Filter 的依赖项时发现错误
- java.lang.IllegalStateException:无法执行操作:在 co.example.filters.Filter 上解析
错误消息:
警告:已检测到以下警告:警告:未知 检测到 HK2 故障:MultiException 堆栈 1 of 2 javax.persistence.PersistenceException:[PersistenceUnit:egunit] 无法在以下位置构建 Hibernate SessionFactory org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl。 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access$600(EntityManagerFactoryBuilderImpl.java:120) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:860) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 在 org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) 在 org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75) 在 org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) 在 co.example.factories.ExampleEntityManagerFactory.(ExampleEntityManagerFactory.java:21)
...
...
...
MultiException 堆栈 2 of 2
java.lang.IllegalStateException:无法执行操作:创建 在 co.example.factories.ExampleEntityManagerFactory 上 org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:395)
在 org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 在 org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:69) 在 org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2064) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87) 在 org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:117) 在 org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 在 org.glassfish.jersey.process.internal.Reque.findOrCreate(RequestScope.java:162) 在 org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2064) 在 org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:711) 在 org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:661) 在 org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:108) 在 co.example.filters.Filter.filter(Filter.java:35)
自定义过滤器:
@Provider
public class Filter implements ContainerRequestFilter {
@Inject private javax.inject.Provider<EntityManager> entityManagerProvider;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
EntityManager entityManager = entityManagerProvider.get();
EntityDao ed = new EntityDao(entityManager);
...
}
工厂:
public class ExampleEntityManagerFactory implements Factory<EntityManager> {
private final CloseableService closeableService;
private final EntityManagerFactory entityManagerFactory;
@Inject
public ExampleEntityManagerFactory(CloseableService closeableService) {
this.closeableService = closeableService;
this.entityManagerFactory = Persistence.createEntityManagerFactory("egunit");
}
@Override
public EntityManager provide() {
final EntityManager instance = entityManagerFactory.createEntityManager();
//closeableService.add(new Closeable() {
// @Override
// public void close() throws IOException {
// if (instance.isOpen()) instance.close();
// }
//});
return instance;
}
@Override
public void dispose(EntityManager instance) {
if (instance.isOpen()) instance.close();
}
}
绑定:
public class Configuration extends ResourceConfig {
public Configuration() {
...
register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ExampleEntityManagerFactory.class).to(EntityManager.class).in(RequestScoped.class);
}
});
}
}
【问题讨论】:
-
编辑后,您现在遇到的问题(异常)与在我的回答中建议的更改之前是否相同?
-
编辑前和编辑后的例外情况不一样。预编辑异常是不在请求范围内,而后编辑似乎提供者无法返回正确的
EntityManagerFactory和随后的EntityManager实例。关于如何进行的想法/想法? -
看看this post。可能有关系。请注意,EMF 不是在 EM 工厂内部创建的,而是作为单例注入的。尝试做出改变,看看会发生什么。另外,不要在
provide中创建 EM,而是尝试在构造函数中创建它,也如帖子中所示。似乎它是在每次查找中调用的,它的范围比请求范围小。不知道为什么会这样。
标签: java jersey jax-rs jersey-2.0