[jboss-jira] [JBoss JIRA] Resolved: (EJBTHREE-2061) ResourceHandler creates an incorrect injector when a bean has a interceptor with injection-target

jaikiran pai (JIRA) jira-events at lists.jboss.org
Mon Apr 5 01:37:38 EDT 2010


     [ https://jira.jboss.org/jira/browse/EJBTHREE-2061?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

jaikiran pai resolved EJBTHREE-2061.
------------------------------------

               Fix Version/s:     (was: as-int 1.1.23)
                  Resolution: Done
    Component Fix Version(s): jboss-ejb3-core:1.3.0


> ResourceHandler creates an incorrect injector when a bean has a interceptor with injection-target
> -------------------------------------------------------------------------------------------------
>
>                 Key: EJBTHREE-2061
>                 URL: https://jira.jboss.org/jira/browse/EJBTHREE-2061
>             Project: EJB 3.0
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.1.22, Plugin 1.0.19, EJB3_1 1.0.5
>            Reporter: jaikiran pai
>            Assignee: jaikiran pai
>             Fix For: EJB3_1 1.0.6
>
>
> Consider the following bean with an interceptor:
> @Stateless
> @Interceptors(SimpleInterceptor.class)
> @Remote(InjectionTester.class)
> public class SimpleStatelessBean implements InjectionTester
> {
> ...
> and the corresponding interceptor class:
> public class SimpleInterceptor
> {
>    private EJBContext ejbContextInjectedThroughEjbJarXml;
> ...
> }
> and the ejb-jar.xml which configures injection-target for the interceptor:
> <?xml version="1.0" encoding="UTF-8"?>
> <ejb-jar
>         xmlns="http://java.sun.com/xml/ns/javaee"
>         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
>                             http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
>         version="3.0">
>         
>         <interceptors>
>             <interceptor>
>                 <interceptor-class>org.jboss.ejb3.test.interceptor.SimpleInterceptor</interceptor-class>
>                 <resource-env-ref>
>                     <resource-env-ref-name>someOtherENCName</resource-env-ref-name>
>                     <resource-env-ref-type>javax.ejb.EJBContext</resource-env-ref-type>
>                     <injection-target>
>                         <injection-target-class>org.jboss.ejb3.test.interceptor.SimpleInterceptor</injection-target-class>
>                         <injection-target-name>ejbContextInjectedThroughEjbJarXml</injection-target-name>
>                     </injection-target>
>                 </resource-env-ref>
>             </interceptor>
>         </interceptors>
> </ejb-jar>        
> This results in the following exception:
> 16:25:56,659 ERROR [FieldBeanProperty] failed to set value org.jboss.ejb3.stateless.StatelessSessionContextImpl at 61a781 on field private javax.ejb.EJBContext org.jboss.ejb3.test.interceptor.SimpleInterceptor.ejbContextInjectedThroughEjbJarXml
> java.lang.IllegalArgumentException: Can not set javax.ejb.EJBContext field org.jboss.ejb3.test.interceptor.SimpleInterceptor.ejbContextInjectedThroughEjbJarXml to org.jboss.ejb3.test.interceptor.SimpleStatelessBean
> 	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
> 	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
> 	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
> 	at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:57)
> 	at java.lang.reflect.Field.set(Field.java:657)
> 	at org.jboss.injection.lang.reflect.FieldBeanProperty.set(FieldBeanProperty.java:74)
> 	at org.jboss.injection.EJBContextPropertyInjector.inject(EJBContextPropertyInjector.java:50)
> 	at org.jboss.injection.EJBContextPropertyInjector.inject(EJBContextPropertyInjector.java:45)
> 	at org.jboss.ejb3.injection.InjectionInvocation.invokeTarget(InjectionInvocation.java:89)
> 	at org.jboss.ejb3.injection.InjectionInvocation.invokeNext(InjectionInvocation.java:83)
> 	at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
> 	at org.jboss.ejb3.injection.InjectionInvocation.invokeNext(InjectionInvocation.java:74)
> 	at org.jboss.ejb3.EJBContainer.injectBeanContext(EJBContainer.java:1138)
> 	at org.jboss.ejb3.pool.AbstractPool.create(AbstractPool.java:83)
> 	at org.jboss.ejb3.InfinitePool.get(InfinitePool.java:56)
> 	at org.jboss.ejb3.InfinitePool.get(InfinitePool.java:51)
> 	at org.jboss.ejb3.pool.ThreadlocalPool.create(ThreadlocalPool.java:52)
> 	at org.jboss.ejb3.pool.ThreadlocalPool.get(ThreadlocalPool.java:92)
> 	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:58)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
> 	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorv2.invoke(RoleBasedAuthorizationInterceptorv2.java:201)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.ejb3.interceptor.EJB3TCCLInterceptor.invoke(EJB3TCCLInterceptor.java:86)
> 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
> 	at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:438)
> 	at org.jboss.ejb3.session.InvokableContextClassProxyHack._dynamicInvoke(InvokableContextClassProxyHack.java:53)
> 	at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:91)
> 	at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
> 	at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:897)
> 	at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:768)
> 	at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:721)
> 	at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:548)
> 	at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:234)
> The ResourceHandler ends up creating an injector for the bean instance (instead of the interceptor):
> private static void loadXmlResourceEnvRefs(InjectionContainer container, Collection<ResourceEnvironmentReferenceMetaData> refs)
>    {
>       for (ResourceEnvironmentReferenceMetaData envRef : refs)
>       {
>         .... 
>         try
>          {
>             if(resTypeName != null)
>             {
>                   ...
>                   if (envRef.getInjectionTargets() != null)
>                   {
>                      InjectionUtil.createInjectors(container.getInjectors(), container.getClassloader(), factory, envRef.getInjectionTargets());
>                      continue;
>                   }
> (Notice the use of InjectionUtil.createInjectors which creates an injector for the bean instance (i.e. adds the injector to container.injectors()). The ResourceHandler should instead use 
> InjectionUtil.injectionTarget(encName, envRef, container, container.getEncInjections());

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the jboss-jira mailing list