Test Fails With
IllegalAccessError:org.jboss.jsr299.tck.tests.implementation.enterprise.definition.EnterpriseBeanDefinitionTest.testConstructorAnnotatedInjectCalled
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key: CDITCK-161
URL:
https://jira.jboss.org/browse/CDITCK-161
Project: CDI TCK
Issue Type: Bug
Security Level: Public (Everyone can see)
Environment: GlassFish v3.0.1
Reporter: Roger Kitain
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?
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira