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:
- java.lang.illegalstateexception: not inside request scope.
- java.lang.illegalargumentexception: while attempting resolve dependencies of co.example.filters.filter errors found
- 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
tdirectly, injectingprovider<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
Post a Comment