You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by Olivier THIERRY <ol...@gmail.com> on 2008/11/19 16:08:35 UTC

Problem with exceptions thrown by stateful session beans ?

Hi,

I have a project with EJB3 Seam components. I write unit tests that will run
on OpenEJB, but I encounter a problem I can't find it is a Seam or OpenEJB
one.

I wrote a Seam component with CONVERSATION scope, i.e. a stateful session
bean. I wrote the following unit test for this component :

    public void testSaveAndDeleteOrganizationType()  throws
java.lang.Exception
    {
        new ComponentTest() {
            public void testComponents() throws java.lang.Exception {

                OrganizationInternalServiceLocal service =
(OrganizationInternalServiceLocal)
getInstance("organizationInternalService");

                // Create a new organization type

                OrganizationType newOrganizationType = new
OrganizationType();
                newOrganizationType.setCode("ORG_TYPE_TEST");
                newOrganizationType.setName("Test organization type");
                newOrganizationType =
service.saveOrganizationType(newOrganizationType);
                assert newOrganizationType.getId() != null;

                // Create a duplicated organization type

                try {
                    OrganizationType duplicatedOrganizationType = new
OrganizationType();
                    duplicatedOrganizationType.setCode("ORG_TYPE_TEST");
                    duplicatedOrganizationType.setName("Test organization
type");
                    duplicatedOrganizationType =
service.saveOrganizationType(duplicatedOrganizationType);
                    assert false;
                }
                catch (Exception exception){
                    assert true;
                }

                // Delete an organization type

                service.deleteOrganizationType(newOrganizationType);
                assert service.loadOrganizationType("ORG_TYPE_TEST") ==
null;

            }
        }.run();
    }

I have a unique constraint on code property of organization type. So when I
try to save an organization type with a code that is already in database,
the saveOrganizationType is expected to throw an exception. Actually it
does, no problem about that. But further calls to the component, for example
deleteOrganizationType method, fail with the following stack trace :

testSaveAndDeleteOrganizationType(t4.core.commons.organization.internal.test.OrganizationInternalServiceTest)
Time elapsed: 0.156 sec  <<< FAILURE!
javax.ejb.NoSuchEJBException: reference is invalid
    at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.isValidReference(BaseEjbProxyHandler.java:319)
    at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:232)
    at $Proxy135.deleteOrganizationType(Unknown Source)
    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:585)
    at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
    at
org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
    at
org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:76)
    at
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
    at
org.jboss.seam.ejb.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:43)
    at
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
    at
org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
    at
org.jboss.seam.intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java:54)
    at
org.javassist.tmp.java.lang.Object_$$_javassist_27.deleteOrganizationType(Object_$$_javassist_27.java)
    at
t4.core.commons.organization.internal.test.OrganizationInternalServiceTest$26.testComponents(OrganizationInternalServiceTest.java:1276)
    at
org.jboss.seam.mock.AbstractSeamTest$ComponentTest.run(AbstractSeamTest.java:163)
    at
t4.core.commons.organization.internal.test.OrganizationInternalServiceTest.testSaveAndDeleteOrganizationType(OrganizationInternalServiceTest.java:1246)

If I set the component to STATELESS scope, i.e. staless session bean, my
unit test works OK ! So what I note is that throwing an exception from a
stateful session bean turns it to invalid. Do you think this is a problem
with OpenEJB or with Seam ?

Thanks in advance,

Olivier

Re: Problem with exceptions thrown by stateful session beans ?

Posted by Dain Sundstrom <da...@iq80.com>.
BTW this annotation is only required on exceptions that extend  
java.lang.RuntimeException.  Normal checked exceptions are considered  
ApplicationExceptions by default.

-dain

On Nov 21, 2008, at 6:57 AM, Olivier THIERRY wrote:

> That's clear to me now. I added @javax.ejb.ApplicationException  
> annotation
> in my exception class and it works perfect now.
> It's not the first time I ask a question on this list, and I always  
> have
> excellent answers. Thanks a lot for the time you took to explain  
> this to me.
>
> Olivier
>
> 2008/11/21 Manu George <ma...@gmail.com>
>
>> Hi Olivier,
>>        Whenever a system exception is thrown by any of the session
>> bean's business methods the bean instance is discarded. In the case  
>> of
>> stateless session beans each method call goes to an instance in the
>> pool. It need not be the same instance. So even if the instance is
>> discarded this is transparent to the bean developer.
>> In the case of a stateful session bean, all the calls go to the same
>> bean and so if the previous call threw a system exception then the
>> corressponding stateful session instance will be discarded and you
>> will get the javax.ejb.NoSuchEJBException.
>>
>> Use the @javax.ejb.ApplicationException annotation to specify that an
>> exception class is an application exception.
>>
>> Regards
>> Manu
>>
>>
>> On Wed, Nov 19, 2008 at 8:38 PM, Olivier THIERRY
>> <ol...@gmail.com> wrote:
>>> Hi,
>>>
>>> I have a project with EJB3 Seam components. I write unit tests  
>>> that will
>> run
>>> on OpenEJB, but I encounter a problem I can't find it is a Seam or
>> OpenEJB
>>> one.
>>>
>>> I wrote a Seam component with CONVERSATION scope, i.e. a stateful  
>>> session
>>> bean. I wrote the following unit test for this component :
>>>
>>>   public void testSaveAndDeleteOrganizationType()  throws
>>> java.lang.Exception
>>>   {
>>>       new ComponentTest() {
>>>           public void testComponents() throws java.lang.Exception {
>>>
>>>               OrganizationInternalServiceLocal service =
>>> (OrganizationInternalServiceLocal)
>>> getInstance("organizationInternalService");
>>>
>>>               // Create a new organization type
>>>
>>>               OrganizationType newOrganizationType = new
>>> OrganizationType();
>>>               newOrganizationType.setCode("ORG_TYPE_TEST");
>>>               newOrganizationType.setName("Test organization type");
>>>               newOrganizationType =
>>> service.saveOrganizationType(newOrganizationType);
>>>               assert newOrganizationType.getId() != null;
>>>
>>>               // Create a duplicated organization type
>>>
>>>               try {
>>>                   OrganizationType duplicatedOrganizationType = new
>>> OrganizationType();
>>>                    
>>> duplicatedOrganizationType.setCode("ORG_TYPE_TEST");
>>>                   duplicatedOrganizationType.setName("Test  
>>> organization
>>> type");
>>>                   duplicatedOrganizationType =
>>> service.saveOrganizationType(duplicatedOrganizationType);
>>>                   assert false;
>>>               }
>>>               catch (Exception exception){
>>>                   assert true;
>>>               }
>>>
>>>               // Delete an organization type
>>>
>>>               service.deleteOrganizationType(newOrganizationType);
>>>               assert service.loadOrganizationType("ORG_TYPE_TEST")  
>>> ==
>>> null;
>>>
>>>           }
>>>       }.run();
>>>   }
>>>
>>> I have a unique constraint on code property of organization type.  
>>> So when
>> I
>>> try to save an organization type with a code that is already in  
>>> database,
>>> the saveOrganizationType is expected to throw an exception.  
>>> Actually it
>>> does, no problem about that. But further calls to the component, for
>> example
>>> deleteOrganizationType method, fail with the following stack trace :
>>>
>>>
>> testSaveAndDeleteOrganizationType 
>> (t4 
>> .core 
>> .commons.organization.internal.test.OrganizationInternalServiceTest)
>>> Time elapsed: 0.156 sec  <<< FAILURE!
>>> javax.ejb.NoSuchEJBException: reference is invalid
>>>   at
>>>
>> org 
>> .apache 
>> .openejb 
>> .core 
>> .ivm.BaseEjbProxyHandler.isValidReference(BaseEjbProxyHandler.java: 
>> 319)
>>>   at
>>>
>> org 
>> .apache 
>> .openejb 
>> .core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:232)
>>>   at $Proxy135.deleteOrganizationType(Unknown Source)
>>>   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:585)
>>>   at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
>>>   at
>>>
>> org 
>> .jboss 
>> .seam 
>> .intercept.RootInvocationContext.proceed(RootInvocationContext.java: 
>> 31)
>>>   at
>>>
>> org.jboss.seam.intercept.ClientSideInterceptor 
>> $1.proceed(ClientSideInterceptor.java:76)
>>>   at
>>>
>> org 
>> .jboss 
>> .seam 
>> .intercept.SeamInvocationContext.proceed(SeamInvocationContext.java: 
>> 56)
>>>   at
>>>
>> org 
>> .jboss 
>> .seam.ejb.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:43)
>>>   at
>>>
>> org 
>> .jboss 
>> .seam 
>> .intercept.SeamInvocationContext.proceed(SeamInvocationContext.java: 
>> 68)
>>>   at
>>> org 
>>> .jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java: 
>>> 107)
>>>   at
>>>
>> org 
>> .jboss 
>> .seam 
>> .intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java: 
>> 54)
>>>   at
>>>
>> org.javassist.tmp.java.lang.Object_$ 
>> $_javassist_27.deleteOrganizationType(Object_$$_javassist_27.java)
>>>   at
>>>
>> t4 
>> .core 
>> .commons.organization.internal.test.OrganizationInternalServiceTest 
>> $26.testComponents(OrganizationInternalServiceTest.java:1276)
>>>   at
>>>
>> org.jboss.seam.mock.AbstractSeamTest 
>> $ComponentTest.run(AbstractSeamTest.java:163)
>>>   at
>>>
>> t4 
>> .core 
>> .commons 
>> .organization 
>> .internal 
>> .test 
>> .OrganizationInternalServiceTest 
>> .testSaveAndDeleteOrganizationType 
>> (OrganizationInternalServiceTest.java:1246)
>>>
>>> If I set the component to STATELESS scope, i.e. staless session  
>>> bean, my
>>> unit test works OK ! So what I note is that throwing an exception  
>>> from a
>>> stateful session bean turns it to invalid. Do you think this is a  
>>> problem
>>> with OpenEJB or with Seam ?
>>>
>>> Thanks in advance,
>>>
>>> Olivier
>>>
>>
>
>
>
> -- 
> Seules 2 choses sont infinies : l'univers et la bêtise humaine ; et  
> encore
> pour l'univers, je ne suis pas sûr … (Einstein)


Re: Problem with exceptions thrown by stateful session beans ?

Posted by Olivier THIERRY <ol...@gmail.com>.
That's clear to me now. I added @javax.ejb.ApplicationException annotation
in my exception class and it works perfect now.
It's not the first time I ask a question on this list, and I always have
excellent answers. Thanks a lot for the time you took to explain this to me.

Olivier

2008/11/21 Manu George <ma...@gmail.com>

> Hi Olivier,
>         Whenever a system exception is thrown by any of the session
> bean's business methods the bean instance is discarded. In the case of
> stateless session beans each method call goes to an instance in the
> pool. It need not be the same instance. So even if the instance is
> discarded this is transparent to the bean developer.
> In the case of a stateful session bean, all the calls go to the same
> bean and so if the previous call threw a system exception then the
> corressponding stateful session instance will be discarded and you
> will get the javax.ejb.NoSuchEJBException.
>
> Use the @javax.ejb.ApplicationException annotation to specify that an
> exception class is an application exception.
>
> Regards
> Manu
>
>
> On Wed, Nov 19, 2008 at 8:38 PM, Olivier THIERRY
> <ol...@gmail.com> wrote:
> > Hi,
> >
> > I have a project with EJB3 Seam components. I write unit tests that will
> run
> > on OpenEJB, but I encounter a problem I can't find it is a Seam or
> OpenEJB
> > one.
> >
> > I wrote a Seam component with CONVERSATION scope, i.e. a stateful session
> > bean. I wrote the following unit test for this component :
> >
> >    public void testSaveAndDeleteOrganizationType()  throws
> > java.lang.Exception
> >    {
> >        new ComponentTest() {
> >            public void testComponents() throws java.lang.Exception {
> >
> >                OrganizationInternalServiceLocal service =
> > (OrganizationInternalServiceLocal)
> > getInstance("organizationInternalService");
> >
> >                // Create a new organization type
> >
> >                OrganizationType newOrganizationType = new
> > OrganizationType();
> >                newOrganizationType.setCode("ORG_TYPE_TEST");
> >                newOrganizationType.setName("Test organization type");
> >                newOrganizationType =
> > service.saveOrganizationType(newOrganizationType);
> >                assert newOrganizationType.getId() != null;
> >
> >                // Create a duplicated organization type
> >
> >                try {
> >                    OrganizationType duplicatedOrganizationType = new
> > OrganizationType();
> >                    duplicatedOrganizationType.setCode("ORG_TYPE_TEST");
> >                    duplicatedOrganizationType.setName("Test organization
> > type");
> >                    duplicatedOrganizationType =
> > service.saveOrganizationType(duplicatedOrganizationType);
> >                    assert false;
> >                }
> >                catch (Exception exception){
> >                    assert true;
> >                }
> >
> >                // Delete an organization type
> >
> >                service.deleteOrganizationType(newOrganizationType);
> >                assert service.loadOrganizationType("ORG_TYPE_TEST") ==
> > null;
> >
> >            }
> >        }.run();
> >    }
> >
> > I have a unique constraint on code property of organization type. So when
> I
> > try to save an organization type with a code that is already in database,
> > the saveOrganizationType is expected to throw an exception. Actually it
> > does, no problem about that. But further calls to the component, for
> example
> > deleteOrganizationType method, fail with the following stack trace :
> >
> >
> testSaveAndDeleteOrganizationType(t4.core.commons.organization.internal.test.OrganizationInternalServiceTest)
> > Time elapsed: 0.156 sec  <<< FAILURE!
> > javax.ejb.NoSuchEJBException: reference is invalid
> >    at
> >
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.isValidReference(BaseEjbProxyHandler.java:319)
> >    at
> >
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:232)
> >    at $Proxy135.deleteOrganizationType(Unknown Source)
> >    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:585)
> >    at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
> >    at
> >
> org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
> >    at
> >
> org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:76)
> >    at
> >
> org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
> >    at
> >
> org.jboss.seam.ejb.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:43)
> >    at
> >
> org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
> >    at
> > org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
> >    at
> >
> org.jboss.seam.intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java:54)
> >    at
> >
> org.javassist.tmp.java.lang.Object_$$_javassist_27.deleteOrganizationType(Object_$$_javassist_27.java)
> >    at
> >
> t4.core.commons.organization.internal.test.OrganizationInternalServiceTest$26.testComponents(OrganizationInternalServiceTest.java:1276)
> >    at
> >
> org.jboss.seam.mock.AbstractSeamTest$ComponentTest.run(AbstractSeamTest.java:163)
> >    at
> >
> t4.core.commons.organization.internal.test.OrganizationInternalServiceTest.testSaveAndDeleteOrganizationType(OrganizationInternalServiceTest.java:1246)
> >
> > If I set the component to STATELESS scope, i.e. staless session bean, my
> > unit test works OK ! So what I note is that throwing an exception from a
> > stateful session bean turns it to invalid. Do you think this is a problem
> > with OpenEJB or with Seam ?
> >
> > Thanks in advance,
> >
> > Olivier
> >
>



-- 
Seules 2 choses sont infinies : l'univers et la bêtise humaine ; et encore
pour l'univers, je ne suis pas sûr … (Einstein)

Re: Problem with exceptions thrown by stateful session beans ?

Posted by Manu George <ma...@gmail.com>.
Hi Olivier,
         Whenever a system exception is thrown by any of the session
bean's business methods the bean instance is discarded. In the case of
stateless session beans each method call goes to an instance in the
pool. It need not be the same instance. So even if the instance is
discarded this is transparent to the bean developer.
In the case of a stateful session bean, all the calls go to the same
bean and so if the previous call threw a system exception then the
corressponding stateful session instance will be discarded and you
will get the javax.ejb.NoSuchEJBException.

Use the @javax.ejb.ApplicationException annotation to specify that an
exception class is an application exception.

Regards
Manu


On Wed, Nov 19, 2008 at 8:38 PM, Olivier THIERRY
<ol...@gmail.com> wrote:
> Hi,
>
> I have a project with EJB3 Seam components. I write unit tests that will run
> on OpenEJB, but I encounter a problem I can't find it is a Seam or OpenEJB
> one.
>
> I wrote a Seam component with CONVERSATION scope, i.e. a stateful session
> bean. I wrote the following unit test for this component :
>
>    public void testSaveAndDeleteOrganizationType()  throws
> java.lang.Exception
>    {
>        new ComponentTest() {
>            public void testComponents() throws java.lang.Exception {
>
>                OrganizationInternalServiceLocal service =
> (OrganizationInternalServiceLocal)
> getInstance("organizationInternalService");
>
>                // Create a new organization type
>
>                OrganizationType newOrganizationType = new
> OrganizationType();
>                newOrganizationType.setCode("ORG_TYPE_TEST");
>                newOrganizationType.setName("Test organization type");
>                newOrganizationType =
> service.saveOrganizationType(newOrganizationType);
>                assert newOrganizationType.getId() != null;
>
>                // Create a duplicated organization type
>
>                try {
>                    OrganizationType duplicatedOrganizationType = new
> OrganizationType();
>                    duplicatedOrganizationType.setCode("ORG_TYPE_TEST");
>                    duplicatedOrganizationType.setName("Test organization
> type");
>                    duplicatedOrganizationType =
> service.saveOrganizationType(duplicatedOrganizationType);
>                    assert false;
>                }
>                catch (Exception exception){
>                    assert true;
>                }
>
>                // Delete an organization type
>
>                service.deleteOrganizationType(newOrganizationType);
>                assert service.loadOrganizationType("ORG_TYPE_TEST") ==
> null;
>
>            }
>        }.run();
>    }
>
> I have a unique constraint on code property of organization type. So when I
> try to save an organization type with a code that is already in database,
> the saveOrganizationType is expected to throw an exception. Actually it
> does, no problem about that. But further calls to the component, for example
> deleteOrganizationType method, fail with the following stack trace :
>
> testSaveAndDeleteOrganizationType(t4.core.commons.organization.internal.test.OrganizationInternalServiceTest)
> Time elapsed: 0.156 sec  <<< FAILURE!
> javax.ejb.NoSuchEJBException: reference is invalid
>    at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.isValidReference(BaseEjbProxyHandler.java:319)
>    at
> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:232)
>    at $Proxy135.deleteOrganizationType(Unknown Source)
>    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:585)
>    at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
>    at
> org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
>    at
> org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:76)
>    at
> org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
>    at
> org.jboss.seam.ejb.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:43)
>    at
> org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
>    at
> org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
>    at
> org.jboss.seam.intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java:54)
>    at
> org.javassist.tmp.java.lang.Object_$$_javassist_27.deleteOrganizationType(Object_$$_javassist_27.java)
>    at
> t4.core.commons.organization.internal.test.OrganizationInternalServiceTest$26.testComponents(OrganizationInternalServiceTest.java:1276)
>    at
> org.jboss.seam.mock.AbstractSeamTest$ComponentTest.run(AbstractSeamTest.java:163)
>    at
> t4.core.commons.organization.internal.test.OrganizationInternalServiceTest.testSaveAndDeleteOrganizationType(OrganizationInternalServiceTest.java:1246)
>
> If I set the component to STATELESS scope, i.e. staless session bean, my
> unit test works OK ! So what I note is that throwing an exception from a
> stateful session bean turns it to invalid. Do you think this is a problem
> with OpenEJB or with Seam ?
>
> Thanks in advance,
>
> Olivier
>