Opened a JIRA to track this https://issues.apache.org/jira/browse/OPENEJB-582
Cheers Prasad On 5/1/07, Prasad Kashyap <[EMAIL PROTECTED]> wrote:
On 3/21/07, David Blevins <[EMAIL PROTECTED]> wrote: > > On Mar 21, 2007, at 7:37 PM, Prasad Kashyap wrote: > > > However, can you please help me understand this better. > > > > Section 12.4 of the spec says, "Lifecycle callback interceptor methods > > may be defined on superclasses of the bean class or interceptor > > classes. However, a given class may not have more than one lifecycle > > callback interceptor method for the same lifecycle event." > > > > Also Section 12.4.1 says, > > • If a bean class has superclasses, any lifecycle callback interceptor > > methods defined on those superclasses are invoked, most general > > superclass first. > > • The lifecycle callback interceptor method, if any, on the bean class > > itself is invoked. > > > > > > My understanding is that for a given lifecycle event, (say > > PostConstruct), the bean's superclass' @PostConstruct is first called > > followed by the bean's @PostConstruct. Am I correct ? > > > > If correct, then how can the superclass' @PostConstruct invoke the > > InvocationContext.proceed() ? The method signature of a lifecycle > > callback method on a bean or it's superclass should be void > > <METHOD>() . Where can it get a handle on the InvocationContext > > object ? How can it proceed down the chain ? > > Good question. Looking at the code, it seems like things will just > come to a halt. We may need to add something in there to fix that. > Has a fix for this been added now ? > -David Cheers Prasad > > > > > On 3/21/07, David Blevins <[EMAIL PROTECTED]> wrote: > >> > >> On Mar 20, 2007, at 1:39 PM, Prasad Kashyap wrote: > >> > >> > https://issues.apache.org/jira/secure/attachment/12353787/ > >> > Interceptor-v2.patch > >> > > >> > I have attached a patch here that defines a stateless bean and a > >> > stateful bean with lifecycle interceptors at many levels. Both the > >> > beans have super class with in-bean lifecycle interceptors. Then > >> the > >> > beans themselves have in-bean lifecycle interceptors. > >> > > >> > The beans declare a @Interceptor class that has lifecycle > >> > interceptors. The interceptor has a super class with lifecycle > >> > interceptor. > >> > > >> > There are printlns in the interceptor code to verify the callbacks > >> > order. > >> > > >> > StatefulInterceptorTests and StatelessInterceptorTests in the > >> client > >> > code invoke the beans though they don't have specific test > >> methods to > >> > test the callbacks. See the printlns above. > >> > > >> > Expected results: (interceptor callback in the following order, > >> as per > >> > Section 12.4.1 of core spec) > >> > ------------------------- > >> > SuperClassInterceptor > >> > ClassInterceptor > >> > SuperBeanInterceptor > >> > InBeanInterceptor > >> > > >> > > >> > Actual Result: > >> > -------------------- > >> > SuperClassInterceptor > >> > > >> > > >> > The top most interceptor in the chain executes. Then it doesn't go > >> > down the chain. You can verify that by removing each top one and it > >> > executes only the next one in the chain. > >> > >> This is strange as I seems to work in this test case: > >> > >> http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/container/ > >> openejb-core/src/test/java/org/apache/openejb/core/stateless/ > >> StatelessInterceptorTest.java?r=519214 > >> > >> Maybe my test case is flawed somehow. > >> > >> The code that should be working and perhaps does not is: > >> > >> 1. Get the callbacks (including @AroundInvoke) declared in the > >> class and it's super class and add them to the descriptor tree > >> (AnnotationDeployer:line 568)[1]. > >> 2. Block out callbacks from parents overridden by the child. > >> (InterceptorBindingBuilder: lines 134)[2] > >> 3. Sort the callbacks parent first, child last > >> (InterceptorBindingBuilder: lines 147)[3] > >> > >> -David > >> > >> [1] http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/ > >> container/openejb-core/src/main/java/org/apache/openejb/config/ > >> AnnotationDeployer.java?r=519454#l568 > >> [2] http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/ > >> container/openejb-core/src/main/java/org/apache/openejb/assembler/ > >> classic/InterceptorBindingBuilder.java?r=519454#l134 > >> [3] http://fisheye6.cenqua.com/browse/openejb/trunk/openejb3/ > >> container/openejb-core/src/main/java/org/apache/openejb/assembler/ > >> classic/InterceptorBindingBuilder.java?r=519454#l147 > >> > >> > >> > >> > > > >
