Hi Gerhard
Thx. Seems that injection is working fine for normal JAX-RS Resources,
but not for JAX-RS Features. I will investigate this further.
An other issue I have noticed that test classes get loaded twice by
openejb. The stack traces look like (1.7.1 version):
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:52037
Thread [main] (Suspended (entry into method <init> in BasicTest))
BasicTest.<init>() line: 17
NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[])
line: not available [native method]
NativeConstructorAccessorImpl.newInstance(Object[]) line: 62
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45
Constructor<T>.newInstance(Object...) line: 408
InjectableConstructor<T>.doInjection() line: 72
InjectionTargetImpl<T>.newInstance(CreationalContextImpl<T>) line: 190
InjectionTargetImpl<T>.produce(Map<Interceptor<?>,?>,
CreationalContextImpl<T>) line: 173
InjectionTargetImpl<T>(AbstractProducer<T>).produce(CreationalContext<T>)
line: 172
ManagedBean<T>(AbstractOwbBean<T>).create(CreationalContext<T>) line: 122
ManagedBean<T>.create(CreationalContext<T>) line: 67
DependentContext.getInstance(Contextual<T>,
CreationalContext<T>) line: 68
DependentContext(AbstractContext).get(Contextual<T>,
CreationalContext<T>) line: 125
BeanManagerImpl.getReference(Bean<?>, Type,
CreationalContext<?>) line: 789
InjectableBeanManager.getReference(Bean<?>, Type,
CreationalContext<?>) line: 165
CdiTestRunner.createTest() line: 203
BlockJUnit4ClassRunner$1.runReflectiveCall() line: 266
BlockJUnit4ClassRunner$1(ReflectiveCallable).run() line: 12
CdiTestRunner(BlockJUnit4ClassRunner).methodBlock(FrameworkMethod) line:
263
CdiTestRunner(BlockJUnit4ClassRunner).runChild(FrameworkMethod,
RunNotifier) line: 78
CdiTestRunner.runChild(FrameworkMethod, RunNotifier) line: 177
CdiTestRunner.runChild(Object, RunNotifier) line: 76
ParentRunner$3.run() line: 290
ParentRunner$1.schedule(Runnable) line: 71
CdiTestRunner(ParentRunner<T>).runChildren(RunNotifier) line: 288
ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 58
ParentRunner$2.evaluate() line: 268
CdiTestRunner$BeforeClassStatement.evaluate() line: 372
CdiTestRunner$AfterClassStatement.evaluate() line: 393
CdiTestRunner(ParentRunner<T>).run(RunNotifier) line: 363
CdiTestRunner.run(RunNotifier) line: 144
JUnit4TestReference.run(TestExecution) line: 86
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution)
line: 459
RemoteTestRunner.runTests(TestExecution) line: 678
RemoteTestRunner.run() line: 382
RemoteTestRunner.main(String[]) line: 192
Thread [ReaderThread] (Running)
Daemon Thread [LogStreamAsync.Thread] (Running)
Daemon Thread [RetryTimer] (Running)
and
Thread [main] (Suspended (entry into method <init> in BasicTest))
BasicTest.<init>() line: 17
NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[])
line: not available [native method]
NativeConstructorAccessorImpl.newInstance(Object[]) line: 62
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45
Constructor<T>.newInstance(Object...) line: 408
InjectableConstructor<T>.doInjection() line: 72
InjectionTargetImpl<T>.newInstance(CreationalContextImpl<T>) line: 190
InjectionTargetImpl<T>.produce(Map<Interceptor<?>,?>,
CreationalContextImpl<T>) line: 173
InjectionTargetImpl<T>(AbstractProducer<T>).produce(CreationalContext<T>)
line: 172
ManagedBean<T>(AbstractOwbBean<T>).create(CreationalContext<T>) line: 122
ManagedBean<T>.create(CreationalContext<T>) line: 67
DependentContext.getInstance(Contextual<T>, CreationalContext<T>)
line: 68
DependentContext(AbstractContext).get(Contextual<T>,
CreationalContext<T>) line: 125
BeanManagerImpl.getReference(Bean<?>, Type, CreationalContext<?>)
line: 789
InjectableBeanManager.getReference(Bean<?>, Type,
CreationalContext<?>) line: 165
CdiTestRunner$ContainerAwareMethodInvoker.evaluate() line: 326
RunBefores.evaluate() line: 26
RunAfters.evaluate() line: 27
CdiTestRunner(ParentRunner<T>).runLeaf(Statement, Description,
RunNotifier) line: 325
CdiTestRunner(BlockJUnit4ClassRunner).runChild(FrameworkMethod,
RunNotifier) line: 78
CdiTestRunner.runChild(FrameworkMethod, RunNotifier) line: 177
CdiTestRunner.runChild(Object, RunNotifier) line: 76
ParentRunner$3.run() line: 290
ParentRunner$1.schedule(Runnable) line: 71
CdiTestRunner(ParentRunner<T>).runChildren(RunNotifier) line: 288
ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 58
ParentRunner$2.evaluate() line: 268
CdiTestRunner$BeforeClassStatement.evaluate() line: 372
CdiTestRunner$AfterClassStatement.evaluate() line: 393
CdiTestRunner(ParentRunner<T>).run(RunNotifier) line: 363
CdiTestRunner.run(RunNotifier) line: 144
JUnit4TestReference.run(TestExecution) line: 86
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution) line: 459
RemoteTestRunner.runTests(TestExecution) line: 678
RemoteTestRunner.run() line: 382
RemoteTestRunner.main(String[]) line: 192
For example, @Before and @Test get called on different instances. It
works when I annotate the test class with @Singleton. Not sure about the
Deltaspike internals, but maybe @RunWith should imply @Singleton. I have
only seen this when using with Jersey. Maybe because it uses request
scoping by default and messes something up within deltaspike.
Regards Remo
Am 16.08.2016 um 15:00 schrieb Gerhard Petracek:
hi remo,
if you would like to stick with tomee/openejb as well as with jersey, you
need a setup which integrates jersey with owb like jersey-weld2-se is doing
it with weld (or jersey with the cdi 1.1+ api) or you need a setup which
integrates tomee/openejb with jersey.
the last time i looked at jersey, only the out-of-the-box integration with
weld worked as expected.
-> if jersey still doesn't provide a better out-of-the-box integration
(based on the cdi 1.1+ api or with owb directly), you need to contact one
of the two communities (tomee or jersey) or replace one of the parts.
regards,
gerhard
2016-08-16 10:03 GMT+02:00 Remo Meier <[email protected]>:
Hi
I attempt to get get the Jersey integration running together with
Deltaspike, OpenEJB and Test Control according to the documentation at the
bottom of the page here:
https://deltaspike.apache.org/documentation/test-control.html
Not working so far is the injection of CDI beans into JAX-RS resources.
The resulting exceptions look like like:
MultiException stack 1 of 1
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object
available for injection at SystemInjecteeImpl(requiredTyp
e=EntityManagerFactory,parent=KatharsisMgmtFeature,qualifier
s={},position=-1,optional=false,self=false,unqualified=null,1475912655)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThir
tyResolver.java:75)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:945)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLoca
torImpl.java:979)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitializ
e(ServiceLocatorImpl.java:1054)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitializ
e(ServiceLocatorImpl.java:1045)
at org.glassfish.jersey.model.internal.CommonConfig.configureFe
atures(CommonConfig.java:711)
at org.glassfish.jersey.model.internal.CommonConfig.configureMe
taProviders(CommonConfig.java:648)
at org.glassfish.jersey.server.ResourceConfig.configureMetaProv
iders(ResourceConfig.java:829)
at org.glassfish.jersey.server.ApplicationHandler.initialize(Ap
plicationHandler.java:453)
at org.glassfish.jersey.server.ApplicationHandler.access$500(Ap
plicationHandler.java:184)
at org.glassfish.jersey.server.ApplicationHandler$3.call(Applic
ationHandler.java:350)
at org.glassfish.jersey.server.ApplicationHandler$3.call(Applic
ationHandler.java:347)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.processWithException(Er
rors.java:255)
at org.glassfish.jersey.server.ApplicationHandler.<init>(Applic
ationHandler.java:347)
at org.glassfish.jersey.server.ApplicationHandler.<init>(Applic
ationHandler.java:311)
at org.glassfish.jersey.jetty.JettyHttpContainer.<init>(JettyHt
tpContainer.java:474)
at org.glassfish.jersey.jetty.JettyHttpContainerProvider.create
Container(JettyHttpContainerProvider.java:60)
at org.glassfish.jersey.server.ContainerFactory.createContainer
(ContainerFactory.java:81)
at org.glassfish.jersey.jetty.JettyHttpContainerFactory.createS
erver(JettyHttpContainerFactory.java:161)
at ch.adnovum.jcan.test.deltaspike.jaxrs.internal.DeltaspikeAwa
reJettyTestContainer.<init>(DeltaspikeAwareJettyTestContainer.java:41)
at ch.adnovum.jcan.test.deltaspike.jaxrs.internal.DeltaspikeAwa
reJettyTestContainerFactory.create(DeltaspikeAwareJettyTes
tContainerFactory.java:16)
at org.glassfish.jersey.test.JerseyTest.createTestContainer(Jer
seyTest.java:277)
at org.glassfish.jersey.test.JerseyTest.setUp(JerseyTest.java:607)
at ch.adnovum.moap.movie.management.web.EntityAccessTest.setUp(
EntityAccessTest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce
ssorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
thodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(
FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(Refl
ectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(Fr
ameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(
RunBefores.java:24)
at org.junit.internal.runners.statements.RunAfters.evaluate(Run
Afters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit
4ClassRunner.java:78)
at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner.
runChild(CdiTestRunner.java:177)
at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner.
runChild(CdiTestRunner.java:76)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner$Be
foreClassStatement.evaluate(CdiTestRunner.java:372)
at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner$Af
terClassStatement.evaluate(CdiTestRunner.java:393)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner.
run(CdiTestRunner.java:144)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.
run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(
TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe
sts(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTe
sts(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(
RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(
RemoteTestRunner.java:192)
KatharsisMgmtFeature is a regular Feature. And their is a Producer that
makes the EntityManagerFactory available with @Inject.
The application works if I manually register a
org.glassfish.hk2.utilities.binding.AbstractBinder bean as singleton to
the Application and use it to bind CDI beans to jersey/hk2 with
AbstractBinder.bind(x).to(y). But I would rather prefer for Jersey to
directly access the CDI beans instead of bridging those with the
AbstractBinder.
My dependencies for Jersey currently look like:
compile 'org.glassfish.jersey.core:jersey-client:2.23.1'
compile 'org.glassfish.jersey.core:jersey-common:2.23.1'
compile 'org.glassfish.jersey.test-framework:jersey-test-framework-
core:2.23.1'
compile 'org.glassfish.jersey.test-framework.providers:jersey-test-
framework-provider-jetty:2.23.1'
compile 'org.glassfish.jersey.containers:jersey-container-jetty-
http:2.23.1'
compile 'org.glassfish.jersey.bundles.repackaged:jersey-guava:2.23.1'
compile 'org.glassfish.jersey.ext.cdi:jersey-cdi1x:2.23.1'
compile 'org.glassfish.jersey.ext.cdi:jersey-cdi1x-transaction:2.23.1'
compile 'org.glassfish.jersey.ext.cdi:jersey-cdi1x-servlet:2.23.1'
The last three are new jersey libraries first having become available last
year. Documentation about those is available here:
https://jersey.java.net/documentation/latest/cdi.support.html.
Potentially that api would open up the possiblity for a small deltaspike
library that does all the necessary integration work (request scoping, cdi
binding), probably independent of Jetty.
Or is there a complete example somewhere?
Regards Remo