I've created a server filter that extends jersey's ContainerRequestFilter, within this custom filter I'd like to inject an (EntityManager) object. To accomplish this I created a factory that implements jersey's hk2.api.Factory and configuration. This setup successfully injects the object into resources, however, it fails to inject the object into the filter.
Does anyone know how to configure jersey to inject objects into filters?
Original Error:
A MultiException has 3 exceptions. They are:
- java.lang.IllegalStateException: Not inside a request scope.
- java.lang.IllegalArgumentException: While attempting to resolve the dependencies of co.example.filters.Filter errors were found
- java.lang.IllegalStateException: Unable to perform operation: resolve on co.example.filters.Filter
Error Messages:
WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected: MultiException stack 1 of 2 javax.persistence.PersistenceException: [PersistenceUnit: egunit] Unable to build Hibernate SessionFactory at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access$600(EntityManagerFactoryBuilderImpl.java:120) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:860) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) at co.example.factories.ExampleEntityManagerFactory.(ExampleEntityManagerFactory.java:21)
...
...
...
MultiException stack 2 of 2
java.lang.IllegalStateException: Unable to perform operation: create on co.example.factories.ExampleEntityManagerFactory at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:395)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:69) at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2064) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105) at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87) at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:117) at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) at org.glassfish.jersey.process.internal.Reque.findOrCreate(RequestScope.java:162) at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2064) at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:711) at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:661) at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:108) at co.example.filters.Filter.filter(Filter.java:35)
Custom Filter:
@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);
...
}
Factory:
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();
}
}
Binding:
public class Configuration extends ResourceConfig {
public Configuration() {
...
register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ExampleEntityManagerFactory.class).to(EntityManager.class).in(RequestScoped.class);
}
});
}
}