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 <[EMAIL PROTECTED]>

> 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
> <[EMAIL PROTECTED]> 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)

Reply via email to