-
Bug
-
Resolution: Done
-
Major
-
None
-
None
-
None
-
GlassFish v3.0.1
org.jboss.jsr299.tck.tests.implementation.enterprise.definition.EnterpriseBeanDefinitionTest.testConstructorAnnotatedInjectCalled fails with:
[testng] java.lang.IllegalAccessError: tried to access class org.jboss.jsr299.tck.tests.implementation.enterprise.definition.SimpleBean from class $Proxy150
>>> [testng] at $Proxy150.getInjectedSimpleBean(Unknown Source)
>>> [testng] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> [testng] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> [testng] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> [testng] at java.lang.reflect.Method.invoke(Method.java:597)
>>> [testng] at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:304)
>>> [testng] at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
>>> [testng] at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)
>>> [testng] at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:298)
>>> [testng] at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:127)
>>> [testng] at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)
>>> [testng] at org.jboss.jsr299.tck.tests.implementation.enterprise.definition.ExplicitConstructor_$$javassist_13.getInjectedSimpleBean(ExplicitConstructor$$_javassist_13.java)
>>> [testng] at org.jboss.jsr299.tck.tests.implementation.enterprise.definition.EnterpriseBeanDefinitionTest.testConstructorAnnotatedInjectCalled(EnterpriseBeanDefinitionTest.java:63)
>>> [testng] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> [testng] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> [testng] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> [testng] at java.lang.reflect.Method.invoke(Method.java:597)
>>> [testng] at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:609)
>>> [testng] at org.testng.internal.MethodHelper$1.runTestMethod(MethodHelper.java:727)
>>> [testng] at org.jboss.testharness.AbstractTest.run(AbstractTest.java:244)
>>> [testng] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> [testng] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> [testng] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> [testng] at java.lang.reflect.Method.invoke(Method.java:597)
>>> [testng] at org.testng.internal.MethodHelper.invokeHookable(MethodHelper.java:735)
>>> [testng] at org.testng.internal.Invoker.invokeMethod(Invoker.java:525)
>>> [testng] at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:686)
>>> [testng] at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1018)
>>> [testng] at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:128)
>>> [testng] at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
>>> [testng] at org.testng.TestRunner.runWorkers(TestRunner.java:759)
>>> [testng] at org.testng.TestRunner.privateRun(TestRunner.java:592)
>>> [testng] at org.testng.TestRunner.run(TestRunner.java:486)
>>> [testng] at org.testng.SuiteRunner.runTest(SuiteRunner.java:332)
>>> [testng] at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:327)
>>> [testng] at org.testng.SuiteRunner.privateRun(SuiteRunner.java:299)
>>> [testng] at org.testng.SuiteRunner.run(SuiteRunner.java:204)
>>> [testng] at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:912)
>>> [testng] at org.testng.TestNG.runSuitesLocally(TestNG.java:876)
>>> [testng] at org.testng.TestNG.run(TestNG.java:784)
>>> [testng] at org.jboss.testharness.impl.runner.TestRunner.run(TestRunner.java:61)
>>> [testng] at org.jboss.testharness.impl.runner.servlet.ServletTestRunner.doGet(ServletTestRunner.java:120)
>>> [testng] at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
>>> [testng] at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
>>> [testng] at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
>>> [testng] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
>>> [testng] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
>>> [testng] at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
>>> [testng] at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
>>> [testng] at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
>>> [testng] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
>>> [testng] at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)
>>> [testng] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)
>>> [testng] at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
>>> [testng] at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
>>> [testng] at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
>>> [testng] at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
>>> [testng] at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
>>> [testng] at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
>>> [testng] at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
>>> [testng] at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
>>> [testng] at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
>>> [testng] at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
>>> [testng] at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
>>> [testng] at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
>>> [testng] at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
>>> [testng] at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
>>> [testng] at java.lang.Thread.run(Thread.java:637)
===========================
> Am Dienstag, den 18.05.2010, 14:07 +0100 schrieb Pete Muir:
>> >> Upon some quick investigation, the problem is that:
>> >>
>> >> * SimpleBean is package protected
>> >> * SimpleBean, the Test and the ExplicitConstructor & it's bean are in the same package
>> >> * the proxy isn't, thus trying to access SimpleBean via it causes this error (I think, not 100% on this)
> >
> > Yes, this appears to be an EJB proxy in GF?
Yes, it's a Java dynamic proxy used by the container to implement an EJB reference for the Local business view of the bean. I found the JDK issue filed for this as of JDK 1.5 , still not addressed : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6256803. The root cause is that the java.lang.reflect.Proxy javadoc says the package of a dynamic proxy for a public interface is undefined. In SUN's JDK the actual package assigned to the package at runtime is 'null', so the proxy gets an IllegalAccessError when attempting to access SimpleBean, which is package private.
The first thing to note is this has nothing to do with the fix to support constructor injection on EJB bean classes. It's pretty easy to reproduce the IllegalAccessError on an unrelated app. Unfortunately the constructor injection fix revealed issues in the only two WELD TCK tests that exercise EJB constructor injection, this being one of them. There's obviously no requirement that the EJB container use JDK dynamic proxies to implement EJB reference objects but it's unrealistic for that strategy to change at this stage and for this issue. The JDK bug evaluator's note makes the point that it's generally bad practice for a public interface to depend on non-public types.
Seems like the best two options are to either modify the test to make SimpleBean a public class or exclude the test. Thoughts?