java - Injecting Objects into Filters -


i've created server filter extends jersey's containerrequestfilter, within custom filter i'd inject (entitymanager) object. accomplish created factory implements jersey's hk2.api.factory , configuration. setup injects object resources, however, fails inject object filter.

does know how configure jersey inject objects filters?

original error:

a multiexception has 3 exceptions. are:

  1. java.lang.illegalstateexception: not inside request scope.
  2. java.lang.illegalargumentexception: while attempting resolve dependencies of co.example.filters.filter errors found
  3. java.lang.illegalstateexception: unable perform operation: resolve on co.example.filters.filter

error messages:

warning: following warnings have been detected: warning: unknown hk2 failure detected: multiexception stack 1 of 2 javax.persistence.persistenceexception: [persistenceunit: egunit] unable build 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 stack 2 of 2
java.lang.illegalstateexception: unable perform operation: create on 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)

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);             }         });       } } 

hard tell for sure without seeing code (and verifying), i'm going make educated guess , it's scoping issue. entitymanager should inherently inside request scope, i'm guessing that's how have set up. works fine in resource class, i'm guessing request scoped (default behavior).

your containerrequestfilter on other hand, in singleton scope. trying inject request scoped entitymanager singleton scoped filter not possible, , getting message "not in request scope" on startup.

one easy fix inject javax.inject.provider<entitymanager>. 1 of things states provider in javadoc:

compared injecting t directly, injecting provider<t>:

  • abstracting scope can instance in smaller scope instance in containing scope.

so

@provider public static class filter implements containerrequestfilter {      @inject     private javax.inject.provider<entitymanager> emprovider;      @override     public void filter(containerrequestcontext request) throws ioexception {         entitymanager em = emprovider.get();     } } 

given else functional, should work (as tested). if not problem/solution, please post code , complete stack trace.


for interested, here complete test, using jersey test framework.

only maven dependency required

<dependency>     <groupid>org.glassfish.jersey.test-framework.providers</groupid>     <artifactid>jersey-test-framework-provider-grizzly2</artifactid>     <version>2.17</version>     <scope>test</scope> </dependency> 

test (if want see fail, remove javax.inject.provider in filter, , simple inject entitymanager)

import java.io.ioexception; import javax.inject.inject; import javax.ws.rs.get; import javax.ws.rs.path; import javax.ws.rs.container.containerrequestcontext; import javax.ws.rs.container.containerrequestfilter; import javax.ws.rs.core.application; import javax.ws.rs.core.response; import javax.ws.rs.ext.provider; import junit.framework.assert; import org.glassfish.hk2.api.factory; import org.glassfish.hk2.utilities.binding.abstractbinder; import org.glassfish.jersey.process.internal.requestscoped; import org.glassfish.jersey.server.resourceconfig; import org.glassfish.jersey.test.jerseytest; import org.junit.test;  public class filterscopetest extends jerseytest {      public static class entitymanager {          public string getentity() {             return "some entity";         }          public void close() {         }     }      public static class entitymanagerfactory implements factory<entitymanager> {          entitymanager em = new entitymanager();          public entitymanagerfactory() {             system.out.println("+++++ entitymanagerfactory created +++++");         }          @override         public entitymanager provide() {             return em;         }          @override         public void dispose(entitymanager t) {             em.close();         }     }      public static class binder extends abstractbinder {          @override         protected void configure() {             bindfactory(entitymanagerfactory.class).to(entitymanager.class).in(requestscoped.class);         }     }      @provider     public static class filter implements containerrequestfilter {          @inject         private javax.inject.provider<entitymanager> em;          public filter() {             system.out.println("+++++ filter created +++++");         }          @override         public void filter(containerrequestcontext request) throws ioexception {             system.out.println("+++++ in filter em null: " + (em.get() == null) + " +++++");             system.out.println("+++++ em entity value: " + (em.get().getentity()) + " +++++");         }     }      @path("em")     public static class emresource {          @inject         entitymanager em;          @get         public string getstuff() {             return em.getentity();         }     }      @override     public application configure() {         return new resourceconfig(emresource.class, filter.class).register(new binder());     }      @test     public void doit() {         response response = target("em").request().get();         assert.assertequals(200, response.getstatus());         system.out.println(response.readentity(string.class));         response.close();     }      @test     public void doit2() {         response response = target("em").request().get();         assert.assertequals(200, response.getstatus());         system.out.println(response.readentity(string.class));         response.close();     } } 

Comments