Hi,
I am using the built-in ThreadLocal feature of the
javax.transaction.TransactionSynchronizationRegistry.
The logic behind it is, that an interceptor creates some Context object
and this context object is used from the EJBs in the different
application layers to store context information like errors, warnings
that occurred. The idea can also be read in detail at
http://www.adam-bien.com/roller/abien/entry/how_to_pass_context_in
While it works fine with Glassfish 2.1.x, my OpenEJB-based Unittests do
not work anymore since I have put this in.
The error that comes up is:
INFO - Configuring enterprise application: classpath.ear
INFO - Configuring Service(id=Default Stateless Container,
type=Container, provider-id=Default Stateless Container)
INFO - Auto-creating a container for bean MyXYZBean:
Container(type=STATELESS, id=Default Stateless Container)
WARN - Jar not loaded. classpath.ear. No provider available for
resource-ref 'null' of type
'javax.transaction.TransactionSynchronizationRegistry' for 'MyXYZBean'.
org.apache.openejb.OpenEJBException: No provider available for
resource-ref 'null' of type
'javax.transaction.TransactionSynchronizationRegistry' for 'MyXYZBean'.
at
org.apache.openejb.config.AutoConfig.autoCreateResource(AutoConfig.java:1342)
at
org.apache.openejb.config.AutoConfig.getResourceId(AutoConfig.java:1335)
at
org.apache.openejb.config.AutoConfig.getResourceId(AutoConfig.java:1286)
at
org.apache.openejb.config.AutoConfig.processResourceRef(AutoConfig.java:799)
at org.apache.openejb.config.AutoConfig.deploy(AutoConfig.java:724)
at org.apache.openejb.config.AutoConfig.deploy(AutoConfig.java:133)
at
org.apache.openejb.config.ConfigurationFactory$Chain.deploy(ConfigurationFactory.java:247)
at
org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:601)
at
org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:551)
at
org.apache.openejb.config.ConfigurationFactory.getOpenEjbConfiguration(ConfigurationFactory.java:380)
at
org.apache.openejb.assembler.classic.Assembler.getOpenEjbConfiguration(Assembler.java:299)
at
org.apache.openejb.assembler.classic.Assembler.build(Assembler.java:278)
at org.apache.openejb.OpenEJB$Instance.<init>(OpenEJB.java:137)
at org.apache.openejb.OpenEJB.init(OpenEJB.java:286)
at org.apache.openejb.OpenEJB.init(OpenEJB.java:265)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.openejb.loader.OpenEJBInstance.init(OpenEJBInstance.java:36)
at
org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:71)
at
org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:53)
at
org.apache.openejb.client.LocalInitialContextFactory.getInitialContext(LocalInitialContextFactory.java:42)
at
javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at
javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
at
de.lwv.hessen.test.local.AbstractOpenEJBLocalTest.setupInitialContext(AbstractOpenEJBLocalTest.java:81)
at
de.lwv.hessen.test.local.AbstractOpenEJBLocalTest.setUp(AbstractOpenEJBLocalTest.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
at
org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
at
org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at
org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at
org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at
org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at
org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at
org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
My code looks like this:
@Stateless
// @RolesAllowed( { "GFHPK", "SACHBEARBEITERLE" })
public class MyXYZBean implements MyXYZLocal, MyXYZRemote {
@EJB
private ISomeEJBServiceLocal someEJBService;
@Resource
private TransactionSynchronizationRegistry tsr;
@Interceptors(FacadeMethodInterceptor.class)
@Override
public Something createSomething(Something something) {
.....
return something;
}
}
Is this feature not supported by OpenEJB?
Or do I have to provide some init stuff in the InitialContext?
Many thanks in advance,
Stephan Bauer