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)