ejb@glassfish.java.net

Re: Application Exception being wrapped into EJBException

From: Antonio Goncalves <antonio.mailing_at_gmail.com>
Date: Thu, 7 Dec 2006 21:20:57 +0100

Hi, I'm coming back to you to say that it's working with V2b27 (nigthly
build 07). My application exception is beeing wrapped correctly into the
EJBException. Voilą.

Thanks,

Antonio


2006/11/27, Antonio Goncalves <antonio.mailing_at_gmail.com>:
>
> Hmmm, I've installed the lastest night build and use my good old script to
> create my domain (this script has worked since b13). When I want to start it
> I have the following exception. Has something changed in the way to create a
> new domain ? I use the following command :
>
> asadmin create-domain --adminport 8282 --adminuser admin
> --savemasterpassword=true --instanceport 8080 petstore
>
>
>
> [#|2006-11-27T20:32:
> 17.640+0100|WARNING|sun-appserver-ee9.1|javax.enterprise.system.stream.err|_ThreadID=10;_ThreadName=main;_RequestID=a3953086-72b0-4a69-a9e3-9c75f2e49d9f;|java.lang.reflect.InvocationTargetException
>
> 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 com.sun.enterprise.server.PELaunch.main(PELaunch.java:272)
> Caused by: java.lang.ExceptionInInitializerError
> at com.sun.enterprise.security.SecurityLifecycle.onInitialization (
> SecurityLifecycle.java:89)
> at com.sun.enterprise.server.ApplicationServer.onInitialization(
> ApplicationServer.java:240)
> at com.sun.enterprise.server.ondemand.OnDemandServer.onInitialization(
> OnDemandServer.java:93)
> at com.sun.enterprise.server.PEMain.run(PEMain.java:316)
> at com.sun.enterprise.server.PEMain.main(PEMain.java:260)
> ... 5 more
> Caused by: java.lang.IllegalStateException: Keystore was tampered with, or
> password was incorrect
> at com.sun.enterprise.security.SecuritySupportImpl.loadStores(
> SecuritySupportImpl.java:104)
> at com.sun.enterprise.security.SecuritySupportImpl.initJKS(
> SecuritySupportImpl.java:72)
> at com.sun.enterprise.security.SecuritySupportImpl .<init>(
> SecuritySupportImpl.java:66)
> at com.sun.enterprise.security.SecuritySupportImpl.<init>(
> SecuritySupportImpl.java:61)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance(
> NativeConstructorAccessorImpl.java:39)
> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(
> DelegatingConstructorAccessorImpl.java:27)
> at java.lang.reflect.Constructor.newInstance (Constructor.java:494)
> at java.lang.Class.newInstance0(Class.java:350)
> at java.lang.Class.newInstance(Class.java:303)
> at com.sun.enterprise.pluggable.PluggableFeatureFactoryBaseImpl.invoke(
> PluggableFeatureFactoryBaseImpl.java :71)
> at $Proxy0.getSecuritySupport(Unknown Source)
> at com.sun.enterprise.security.SecurityUtil.getSecuritySupport(
> SecurityUtil.java:354)
> at com.sun.enterprise.security.SSLUtils.<clinit>(SSLUtils.java:86)
> ... 10 more
>
>
>
> 2006/11/27, Cheng Fang <Cheng.Fang_at_sun.com>:
> >
> > Hi Antonio,
> >
> > From https://glassfish.dev.java.net/public/downloadsindex.html , V2b24
> > was built on Nov 1, 2006.
> >
> > The fix for glassfish issue 1359 was committed on Nov 10, 2006.
> > https://glassfish.dev.java.net/issues/show_bug.cgi?id=1359
> > (EJBException is not properly initialized)
> >
> > So the fix was not in V2B24. Can you try a recent nightly build? If
> > you still see this problem, feel free to reopen the issue with
> > additional details and tests.
> >
> > -cheng
> >
> > Antonio Goncalves wrote:
> > > Hi,
> > >
> > > I'm using V2b24 but I've also tried with b19 and even b13 just to be
> > sure.
> > >
> > > I've tried ejbException.getCause but it returns null, and here is the
> > > stack trace of ejbException.getCausedByException. As you can see, my
> > > ValidationException has vanished from the stacktrace.
> > >
> > >
> > > java.rmi.ServerException: RemoteException occurred in server thread;
> > > nested exception is:
> > > java.rmi.RemoteException
> > > at
> > > com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(
> > Util.java:196)
> > > at
> > >
> > com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke
> > > (StubInvocationHandlerImpl.java:176)
> > > at
> > >
> > com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(
> > StubInvocationHandlerImpl.java:123)
> > > at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke
> > > (BCELStubBase.java:197)
> > > at
> > >
> > com.yaps.petstore.stateless.catalog.__CatalogRemote_Remote_DynamicStub.createCategory
> > (__CatalogRemote_Remote_DynamicStub.java)
> > > at
> > >
> > com.yaps.petstore.stateless.catalog._CatalogRemote_Wrapper.createCategory
> > > (com.yaps.petstore.stateless.catalog._CatalogRemote_Wrapper.java)
> > > at
> > > com.yaps.petstore.client.delegate.CatalogDelegate.createCategory(
> > CatalogDelegate.java:24)
> > > at
> > >
> > com.yaps.petstore.client.ui.catalog.category.CategoryCrudFrame.createActionPerformed
> > > (CategoryCrudFrame.java:79)
> > > at
> > > com.yaps.petstore.client.ui.util.YapsActionPane.fireActionPerformed(
> > YapsActionPane.java:192)
> > > at
> > > com.yaps.petstore.client.ui.util.YapsActionPane.access$000 (
> > YapsActionPane.java:23)
> > > at
> > > com.yaps.petstore.client.ui.util.YapsActionPane$2.actionPerformed(
> > YapsActionPane.java:106)
> > > at
> > > javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
> > > at javax.swing.AbstractButton$Handler.actionPerformed
> > > (AbstractButton.java:2169)
> > > at
> > > javax.swing.DefaultButtonModel.fireActionPerformed(
> > DefaultButtonModel.java:420)
> > > at javax.swing.DefaultButtonModel.setPressed (DefaultButtonModel.java
> > :258)
> > > at javax.swing.plaf.basic.BasicButtonListener.mouseReleased
> > > (BasicButtonListener.java:236)
> > > at java.awt.Component.processMouseEvent(Component.java:5488)
> > > at javax.swing.JComponent.processMouseEvent (JComponent.java:3126)
> > > at java.awt.Component.processEvent(Component.java:5253)
> > > at java.awt.Container.processEvent(Container.java:1966)
> > > at java.awt.Component.dispatchEventImpl(Component.java:3955)
> > > at java.awt.Container.dispatchEventImpl(Container.java:2024)
> > > at java.awt.Component.dispatchEvent (Component.java:3803)
> > > at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java
> > :4212)
> > > at java.awt.LightweightDispatcher.processMouseEvent(Container.java
> > :3892)
> > > at java.awt.LightweightDispatcher.dispatchEvent (Container.java:3822)
> > > at java.awt.Container.dispatchEventImpl(Container.java :2010)
> > > at java.awt.Window.dispatchEventImpl(Window.java:1778)
> > > at java.awt.Component.dispatchEvent(Component.java:3803)
> > > at java.awt.EventQueue.dispatchEvent (EventQueue.java:463)
> > > at
> > > java.awt.EventDispatchThread.pumpOneEventForHierarchy(
> > EventDispatchThread.java:242)
> > > at
> > > java.awt.EventDispatchThread.pumpEventsForHierarchy(
> > EventDispatchThread.java:163)
> > > at java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java
> > :157)
> > > at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java
> > :149)
> > > at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
> > > Caused by: java.rmi.RemoteException
> > > at
> > > com.sun.enterprise.iiop.POAProtocolMgr.mapException(
> > POAProtocolMgr.java:234)
> > > at
> > > com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java
> > :1303)
> > > at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke (
> > > EJBObjectInvocationHandler.java:197)
> > > at
> > > com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(
> > EJBObjectInvocationHandlerDelegate.java:110)
> > > at $Proxy77.createCategory(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
> > > com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(
> > ReflectiveTie.java:125)
> > > at
> > >
> > com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant
> > (CorbaServerRequestDispatcherImpl.java
> > > :650)
> > > at
> > >
> > com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(
> > CorbaServerRequestDispatcherImpl.java:193)
> > > at
> > >
> > com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest
> > (CorbaMessageMediatorImpl.java
> > > :1711)
> > > at
> > > com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(
> > CorbaMessageMediatorImpl.java:1571)
> > > at
> > > com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(
> > CorbaMessageMediatorImpl.java
> > > :953)
> > > at
> > >
> > com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:182)
> > > at
> > > com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(
> > CorbaMessageMediatorImpl.java
> > > :723)
> > > at
> > > com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.dispatch(
> > SocketOrChannelConnectionImpl.java:480)
> > > at
> > > com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.doWork(
> > SocketOrChannelConnectionImpl.java
> > > :1356)
> > > at
> > >
> > com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(
> > ThreadPoolImpl.java:467)
> > >
> > >
> > > 2006/11/27, Cheng Fang <Cheng.Fang_at_sun.com <mailto:Cheng.Fang_at_sun.com
> > >>:
> > >
> > > Hi Antonio,
> > >
> > > In your Swing client, can you try
> > >
> > > ejbException.|* getCausedByException
> > > <http://java.sun.com/javaee/5/docs/api/javax/ejb/EJBException.html#getCausedByException%28%29
> > >*(),
> > > and ejbException.getCause()? At least one of them should return
> > > the root cause.
> > >
> > > -cheng
> > > |
> > >
> > > Antonio Goncalves wrote:
> > >> Hi,
> > >>
> > >> Sorry for bringing back an old thread, but I have some issues
> > >> with that.
> > >>
> > >> The problem is that during a call back method of my entity bean I
> > >> throw an application exception. This exception is wrapped into an
> > >> EJBException by the container. What I've done is that I take this
> >
> > >> EJBException and get the root cause. If it's an instance of my
> > >> ValidationException, I display its message. It works fine with
> > >> JSF and I can display an "invalide name" (for example) in my web
> > >> page.
> > >>
> > >> But when I try to do the same with a swing application, it
> > >> doesn't work. The problem is that the Swing app gets the
> > >> EJBException but with no root cause. When I call the methode
> > >> e.getCause() it returns null. It looks like my
> > >> ValidationException is not wrapped into the EJBException when
> > >> leaving the container.
> > >>
> > >> Does anybody have an idea ?
> > >>
> > >> Thanks,
> > >>
> > >> Antonio
> > >>
> > >>
> > >> 2006/10/2, Antonio Goncalves <antonio.mailing_at_gmail.com
> > >> <mailto:antonio.mailing_at_gmail.com>>:
> > >>
> > >> > Also note that even if the ValidationException were to be
> > >> propagated as
> > >> > is, the persistence manager still would not know it is an
> > >> EJB "Application Exception"
> > >> > so any required behavior such as marking the transaction
> > for
> > >> rollback would still be
> > >> > performed by the persistence manager regardless of the
> > >> attributes of the
> > >> > @ApplicationException definition.
> > >>
> > >> That makes sense. I going to try a similar use case outside
> > >> the container to see what king of exception is thrown. I've
> > >> changed my ValidationException to extend Exception instead of
> >
> > >> RuntimeException, but it doesn't work either. The exception
> > >> is still wrapped into an EJBException and the root cause is
> > >> event worse *Caused by: java.lang.ClassCastException :
> > >> com.yaps.petstore.exception.ValidationException *.
> > >>
> > >>
> > >> javax.ejb.EJBException
> > >> at
> > >> com.sun.ejb.containers.BaseContainer.processSystemException (
> > BaseContainer.java:3753)
> > >> at
> > >> com.sun.ejb.containers.BaseContainer.completeNewTx(
> > BaseContainer.java:3653)
> > >> at com.sun.ejb.containers.BaseContainer.postInvokeTx
> > >> (BaseContainer.java:3455)
> > >> at
> > >> com.sun.ejb.containers.BaseContainer.postInvoke(
> > BaseContainer.java:1257)
> > >> at
> > >> com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke
> > >> (EJBLocalObjectInvocationHandler.java:192)
> > >> at
> > >>
> > com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(
> > EJBLocalObjectInvocationHandlerDelegate.java :118)
> > >> at $Proxy69.createCustomer(Unknown Source)
> > >>
> > >> at
> > >> com.yaps.petstore.web.jsf.AccountController.doCreateCustomer
> > >> (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 com.sun.el.parser.AstValue.invoke (AstValue.java:157)
> > >> at
> > >> com.sun.el.MethodExpressionImpl.invoke(
> > MethodExpressionImpl.java
> > >> :283)
> > >> at
> > >>
> > javax.faces.component.MethodBindingMethodExpressionAdapter.invoke (
> > MethodBindingMethodExpressionAdapter.java:71)
> > >> at
> > >> com.sun.faces.application.ActionListenerImpl.processAction
> > >> (ActionListenerImpl.java:96)
> > >> at javax.faces.component.UICommand.broadcast(UICommand.java
> > :383)
> > >> at
> > >> javax.faces.component.UIViewRoot.broadcastEvents(
> > UIViewRoot.java
> > >> :471)
> > >> at javax.faces.component.UIViewRoot.processApplication
> > >> (UIViewRoot.java:783)
> > >> at
> > >> com.sun.faces.lifecycle.InvokeApplicationPhase.execute(
> > InvokeApplicationPhase.java:97)
> > >> at com.sun.faces.lifecycle.LifecycleImpl.phase
> > >> (LifecycleImpl.java:244)
> > >> at com.sun.faces.lifecycle.LifecycleImpl.execute
> > >> (LifecycleImpl.java :113)
> > >> at
> > >> javax.faces.webapp.FacesServlet.service(FacesServlet.java
> > :244)
> > >> at
> > >>
> > org.apache.catalina.core.ApplicationFilterChain.servletService
> > >> (ApplicationFilterChain.java:397)
> > >> at org.apache.catalina.core.StandardWrapperValve.invoke
> > >> (StandardWrapperValve.java:278)
> > >> at
> > >> org.apache.catalina.core.StandardPipeline.doInvoke(
> > StandardPipeline.java:586)
> > >> at org.apache.catalina.core.StandardPipeline.invoke
> > >> (StandardPipeline.java:556)
> > >> at
> > >> org.apache.catalina.core.StandardContextValve.invokeInternal
> > >> (StandardContextValve.java:246)
> > >> at
> > >> org.apache.catalina.core.StandardContextValve.invoke (
> > StandardContextValve.java:185)
> > >> at
> > >> org.apache.catalina.core.StandardPipeline.doInvoke(
> > StandardPipeline.java:586)
> > >> at com.sun.enterprise.web.WebPipeline.invoke
> > >> (WebPipeline.java:73)
> > >> at
> > >> org.apache.catalina.core.StandardHostValve.invoke(
> > StandardHostValve.java
> > >> :182)
> > >> at
> > >> org.apache.catalina.core.StandardPipeline.doInvoke(
> > StandardPipeline.java:586)
> > >> at com.sun.enterprise.web.VirtualServerPipeline.invoke
> > >> (VirtualServerPipeline.java:120)
> > >> at org.apache.catalina.core.ContainerBase.invoke
> > >> (ContainerBase.java:939)
> > >> at
> > >> org.apache.catalina.core.StandardEngineValve.invoke(
> > StandardEngineValve.java:137)
> > >> at org.apache.catalina.core.StandardPipeline.doInvoke
> > >> (StandardPipeline.java:586)
> > >> at org.apache.catalina.core.StandardPipeline.invoke
> > >> (StandardPipeline.java:556)
> > >> at
> > >> org.apache.catalina.core.ContainerBase.invoke(
> > ContainerBase.java:939)
> > >> at org.apache.coyote.tomcat5.CoyoteAdapter.service
> > >> (CoyoteAdapter.java :231)
> > >> at
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter
> > >> (DefaultProcessorTask.java:619)
> > >> at
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.processNonBlocked
> > >> (DefaultProcessorTask.java:550)
> > >> at
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process
> > >> (DefaultProcessorTask.java:780)
> > >> at
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask
> > >> (DefaultReadTask.java:326)
> > >> at
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(
> > DefaultReadTask.java
> > >> :251)
> > >> at
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask (
> > DefaultReadTask.java:205)
> > >>
> > >> at
> > >> com.sun.enterprise.web.connector.grizzly.TaskBase.run(
> > TaskBase.java:252)
> > >> at
> > >> com.sun.enterprise.web.connector.grizzly.WorkerThreadImpl.run
> > >> (WorkerThreadImpl.java:103)
> > >> *Caused by: java.lang.ClassCastException :
> > >> com.yaps.petstore.exception.ValidationException*
> > >> at
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.metadata.listeners.MetadataEntityListener.invokeMethod
> > >> (MetadataEntityListener.java:313)
> > >> at
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.metadata.listeners.MetadataEntityClassListener.invokeMethod
> > >> (MetadataEntityClassListener.java:69)
> > >> at
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.metadata.listeners.MetadataEntityListener
> > >> .prePersist( MetadataEntityListener.java:439)
> > >> at
> > >>
> > oracle.toplink.essentials.descriptors.DescriptorEventManager.notifyListener
> > >> (DescriptorEventManager.java:658)
> > >> at
> > >>
> > oracle.toplink.essentials.descriptors.DescriptorEventManager.notifyEJB30Listeners
> > >> (DescriptorEventManager.java:601)
> > >> at
> > >>
> > oracle.toplink.essentials.descriptors.DescriptorEventManager.executeEvent
> > >> (DescriptorEventManager.java:199)
> > >> at
> > >>
> > oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist
> > >> (UnitOfWorkImpl.java :3226)
> > >> at
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist
> > >> (RepeatableWriteUnitOfWork.java:298)
> > >> at
> > >>
> > oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist
> > >> (UnitOfWorkImpl.java:3186)
> > >> at
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist
> > >> (EntityManagerImpl.java:170)
> > >> at
> > >> com.sun.enterprise.util.EntityManagerWrapper.persist(
> > EntityManagerWrapper.java
> > >> :433)
> > >> at
> > >>
> > com.yaps.petstore.service.customer.CustomerBean.createCustomer(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
> > >>
> > com.sun.enterprise.security.application.EJBSecurityManager.runMethod
> > >> (EJBSecurityManager.java:1050)
> > >> at
> > >> com.sun.enterprise.security.SecurityUtil.invoke(
> > SecurityUtil.java:165)
> > >> at
> > >> com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod
> > >> (BaseContainer.java:2788)
> > >> at com.sun.ejb.containers.BaseContainer.intercept
> > >> (BaseContainer.java:3870)
> > >> at
> > >> com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(
> > EJBLocalObjectInvocationHandler.java:184)
> > >> ... 43 more
> > >>
> > >>
> > >>
> > >> 2006/10/2, Kenneth Saks <Kenneth.Saks_at_sun.com
> > >> <mailto:Kenneth.Saks_at_sun.com>>:
> > >>
> > >> Cheng Fang wrote:
> > >>
> > >> > Our tests for the similar scenario passed. The only
> > >> difference
> > >> > between our tests and your is, your ValidationException
> > >> is from Entity
> > >> > lifecycle callback methods, and our unchecked
> > >> ApplicationException is
> > >> > from a regular slsb business methods.
> > >> > JPA spec says entity lifecycle callback methods may
> > throw
> > >> > runtime/uncheckec exception, which causes the current
> > >> transaction to
> > >> > be rolled back. So your unchecked ApplicationException
> > >> behaves more
> > >> > like a system exception. EJB interceptor methods are
> > >> more restrictive
> > >> > in that it does not allow any application exception.
> > >>
> > >> That's true of callbacks defined in an interceptor class,
> > >> but not true
> > >> of AroundInvoke methods.
> > >> The signature of an AroundInvoke method is defined to
> > throw
> > >> java.lang.Exception so that it may
> > >> propagate any application-defined exceptions that appear
> > >> in the
> > >> corresponding business
> > >> method's signature.
> > >>
> > >> >
> > >> >
> > >> > Throwing such runtime exception from @PrePersist seems
> > a
> > >> pretty common
> > >> > use case. The JPA spec has such an example. Can
> > >> someone clarify?
> > >>
> > >> I'm not aware of any requirements in the persistence spec
> > >> that guarantee
> > >> that an exception thrown
> > >> by the entity code will propagate *as is* back to the
> > >> caller of an
> > >> EntityManager API. The EntityManager
> > >> API is typed to throw certain specific runtime
> > >> exceptions. The
> > >> @ApplicationException behavior
> > >> is EJB-container specific, so the persistence manager
> > >> doesn't know
> > >> anything about it. The persistence
> > >> manager is probably just wrapping the ValidationException
> > >> into one of
> > >> the exceptions defined in
> > >> the persist() API method signature. The ejb container
> > >> then sees a
> > >> runtime exception, not an
> > >> Application Exception.
> > >>
> > >> Also note that even if the ValidationException were to be
> >
> > >> propagated as
> > >> is, the persistence
> > >> manager still would not know it is an EJB "Application
> > >> Exception" so any
> > >> required behavior
> > >> such as marking the transaction for rollback would still
> > >> be performed by
> > >> the persistence
> > >> manager regardless of the attributes of the
> > >> @ApplicationException
> > >> definition.
> > >>
> > >> --ken
> > >>
> > >> >
> > >> >
> > >> > Cheng
> > >> >
> > >> >
> > >> >
> > >> >
> > >> > Antonio Goncalves wrote:
> > >> >
> > >> >> Hi,
> > >> >>
> > >> >> I've got a JSF back bean trying to catch my
> > application
> > >> exception but
> > >> >> ends up with an EJBException. Here is my model :
> > >> >>
> > >> >> * A Customer entity bean throws an Application
> > >> Exception in a call
> > >> >> back method to validate its data
> > >> >>
> > >> >> @Entity
> > >> >> public class Customer implements Serializable {
> > >> >>
> > >> >> @PrePersist
> > >> >> @PreUpdate
> > >> >> private void validateData() {
> > >> >> if (firstname == null || "".equals(firstname))
> > >> >> throw new *ValidationException*("Invalid
> > >> first name");
> > >> >> if (lastname == null || "".equals(lastname))
> > >> >> throw new ValidationException("Invalid
> > last
> > >> name");
> > >> >> }
> > >> >> }
> > >> >>
> > >> >> * The Validation Exception is a RuntimeException but
> > >> uses the
> > >> >> ApplicationException annotation
> > >> >>
> > >> >> @*ApplicationException*(rollback = true)
> > >> >> public class *ValidationException* extends
> > >> *RuntimeException* {
> > >> >>
> > >> >> }
> > >> >>
> > >> >> * Between the Entity and JSF there is a Stateless bean
> >
> > >> that
> > >> >> manipulates this entity but doesn't wrap or throw an
> > >> exception
> > >> >>
> > >> >> @Stateless
> > >> >> public class CustomerBean implements CustomerRemote,
> > >> CustomerLocal {
> > >> >>
> > >> >> @PersistenceContext(name = "petstorePU")
> > >> >> private EntityManager em;
> > >> >>
> > >> >> public Customer createCustomer(final Customer
> > >> customer) {
> > >> >> em.persist(*customer*);
> > >> >> }
> > >> >>
> > >> >> }
> > >> >>
> > >> >> * My JSF Back Bean calls the Stateless to create a
> > >> customer. He tries
> > >> >> to catch the ValidationException and display the error
> > >> message on my
> > >> >> page
> > >> >>
> > >> >> public String doCreateCustomer() {
> > >> >>
> > >> >> FacesContext context =
> > >> FacesContext.getCurrentInstance ();
> > >> >> String navigateTo = null;
> > >> >>
> > >> >> try {
> > >> >> customer = customerBean.createCustomer
> > >> (customer, address);
> > >> >> } *catch (ValidationException e)* {
> > >> >> context.addMessage(null, new
> > >> >> FacesMessage( FacesMessage.SEVERITY_WARN ,
> > >> e.getMessage(), null));
> > >> >> }
> > >> >>
> > >> >> If I change the catch (ValidationException e) into
> > catch
> > >> >> (EJBException e) it woks because here is my stack
> > trace
> > >> on the server
> > >> >>
> > >> >> *javax.ejb.EJBException*
> > >> >> at
> > >> >>
> > >>
> > com.sun.ejb.containers.BaseContainer.processSystemException(
> > BaseContainer.java:3753)
> > >> >>
> > >> >> at
> > >> >>
> > >> com.sun.ejb.containers.BaseContainer.completeNewTx(
> > BaseContainer.java:3653)
> > >> >>
> > >> >> at
> > >> >>
> > >> com.sun.ejb.containers.BaseContainer.postInvokeTx(
> > BaseContainer.java:3455)
> > >> >>
> > >> >> at
> > >> >>
> > >> com.sun.ejb.containers.BaseContainer.postInvoke(
> > BaseContainer.java:1257)
> > >> >> at
> > >>
> > com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke
> > >> >> ( EJBLocalObjectInvocationHandler.java:192)
> > >> >> at
> > >> >>
> > >>
> > com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(
> > EJBLocalObjectInvocationHandlerDelegate.java
> > >> :118)
> > >> >>
> > >> >> at $Proxy163.createCustomer(Unknown Source)
> > >> >> at
> > >> >>
> > >>
> > com.yaps.petstore.web.jsf.AccountController.doCreateCustomer(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 com.sun.el.parser.AstValue.invoke(AstValue.java
> > :157)
> > >> >> at
> > >> >>
> > >> com.sun.el.MethodExpressionImpl.invoke(
> > MethodExpressionImpl.java
> > >> :283)
> > >> >> at
> > >> >>
> > >>
> > javax.faces.component.MethodBindingMethodExpressionAdapter.invoke (
> > MethodBindingMethodExpressionAdapter.java:71)
> > >> >>
> > >> >> at
> > >>
> > com.sun.faces.application.ActionListenerImpl.processAction
> > >> >> ( ActionListenerImpl.java:96)
> > >> >> at
> > >> javax.faces.component.UICommand.broadcast(UICommand.java
> > :383)
> > >> >> at
> > >> >>
> > >> javax.faces.component.UIViewRoot.broadcastEvents(
> > UIViewRoot.java:471)
> > >> >> at
> > javax.faces.component.UIViewRoot.processApplication
> > >> >> (UIViewRoot.java :783)
> > >> >> at
> > >> >>
> > >> com.sun.faces.lifecycle.InvokeApplicationPhase.execute(
> > InvokeApplicationPhase.java:97)
> > >> >>
> > >> >> at
> > >> com.sun.faces.lifecycle.LifecycleImpl.phase(
> > LifecycleImpl.java:244)
> > >> >> at com.sun.faces.lifecycle.LifecycleImpl.execute
> > >> >> ( LifecycleImpl.java:113)
> > >> >> at javax.faces.webapp.FacesServlet.service
> > >> (FacesServlet.java:244)
> > >> >> at
> > >> >>
> > >>
> > org.apache.catalina.core.ApplicationFilterChain.servletService(
> > ApplicationFilterChain.java:397)
> > >> >>
> > >> >> at
> > org.apache.catalina.core.StandardWrapperValve.invoke
> > >> >> (StandardWrapperValve.java:278)
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.StandardPipeline.doInvoke(
> > StandardPipeline.java :586)
> > >> >>
> > >> >> at
> > >> >> org.apache.catalina.core.StandardPipeline.invoke
> > >> (StandardPipeline.java:556)
> > >> >>
> > >> >> at
> > >>
> > org.apache.catalina.core.StandardContextValve.invokeInternal
> > >> >> (StandardContextValve.java:246)
> > >> >> at
> > >> >> org.apache.catalina.core.StandardContextValve.invoke
> > >> (StandardContextValve.java:185)
> > >> >>
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.StandardPipeline.doInvoke(
> > StandardPipeline.java:586)
> > >> >>
> > >> >> at com.sun.enterprise.web.WebPipeline.invoke (
> > >> WebPipeline.java:73)
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.StandardHostValve.invoke(
> > StandardHostValve.java:182)
> > >> >>
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.StandardPipeline.doInvoke(
> > StandardPipeline.java
> > >> :586)
> > >> >>
> > >> >> at
> > com.sun.enterprise.web.VirtualServerPipeline.invoke
> > >> >> (VirtualServerPipeline.java:120)
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.ContainerBase.invoke(
> > ContainerBase.java
> > >> :939)
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.StandardEngineValve.invoke (
> > StandardEngineValve.java:137)
> > >> >>
> > >> >> at org.apache.catalina.core.StandardPipeline.doInvoke
> > >> >> (StandardPipeline.java :586)
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.StandardPipeline.invoke(
> > StandardPipeline.java:556)
> > >> >>
> > >> >> at
> > >> >>
> > >> org.apache.catalina.core.ContainerBase.invoke(
> > ContainerBase.java:939)
> > >> >> at org.apache.coyote.tomcat5.CoyoteAdapter.service
> > >> >> (CoyoteAdapter.java :231)
> > >> >> at
> > >> >>
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter
> > (DefaultProcessorTask.java
> > >> :619)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.processNonBlocked
> > >> >> ( DefaultProcessorTask.java:550)
> > >> >> at
> > >> >>
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process
> > >> (DefaultProcessorTask.java :780)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask
> > >> >> ( DefaultReadTask.java:326)
> > >> >> at
> > >> >>
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask
> > >> (DefaultReadTask.java :251)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(
> > DefaultReadTask.java:205)
> > >> >>
> > >> >> at
> > >> >> com.sun.enterprise.web.connector.grizzly.TaskBase.run
> > >> (TaskBase.java:252)
> > >> >> at
> > >> >>
> > >>
> > com.sun.enterprise.web.connector.grizzly.WorkerThreadImpl.run(
> > WorkerThreadImpl.java:103)
> > >> >>
> > >> >> Caused by: com.yaps.petstore.exception.*
> > >> ValidationException*:
> > >> >> Invalid first name
> > >> >> at
> > >> com.yaps.petstore.domain.customer.Customer.validateData(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
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.security.PrivilegedAccessHelper.invokeMethod
> > >> >> (PrivilegedAccessHelper.java:307)
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.metadata.listeners.MetadataEntityListener.invokeMethod(
> > MetadataEntityListener.java:302)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.metadata.listeners.MetadataEntityClassListener.invokeMethod
> > >>
> > >> >> (MetadataEntityClassListener.java:69)
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.metadata.listeners.MetadataEntityListener.prePersist(
> > MetadataEntityListener.java:439)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.descriptors.DescriptorEventManager.notifyListener
> > >> >> (DescriptorEventManager.java:658)
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.descriptors.DescriptorEventManager.notifyEJB30Listeners
> > >> (DescriptorEventManager.java:601)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.descriptors.DescriptorEventManager.executeEvent
> > >> >> (DescriptorEventManager.java:199)
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(
> > UnitOfWorkImpl.java:3226)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist
> > >>
> > >> >> (RepeatableWriteUnitOfWork.java:298)
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(
> > UnitOfWorkImpl.java:3186)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.persist
> > >> >> (EntityManagerImpl.java:170)
> > >> >> at
> > >> >>
> > >> com.sun.enterprise.util.EntityManagerWrapper.persist(
> > EntityManagerWrapper.java
> > >> :433)
> > >> >>
> > >> >> at
> > >> >>
> > >>
> > com.yaps.petstore.service.customer.CustomerBean.createCustomer(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
> > >> >>
> > >>
> > com.sun.enterprise.security.application.EJBSecurityManager.runMethod(
> > EJBSecurityManager.java:1050)
> > >> >>
> > >> >> at
> > >> >>
> > >> com.sun.enterprise.security.SecurityUtil.invoke(
> > SecurityUtil.java:165)
> > >> >> at
> > >>
> > com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod
> > >> >> (BaseContainer.java:2788)
> > >> >> at
> > >> >>
> > >> com.sun.ejb.containers.BaseContainer.intercept(
> > BaseContainer.java:3870)
> > >> >> at
> > >> >>
> > >>
> > com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(
> > EJBLocalObjectInvocationHandler.java:184)
> > >> >>
> > >> >> ... 43 more
> > >> >>
> > >> >> I am confused because on the EJB specification this is
> > >> what's written :
> > >> >>
> > >> >> 14.1.1 Application Exceptions
> > >> >>
> > >> >> An application exception may be a subclass (direct or
> > >> indirect) of
> > >> >> java.lang.Exception (i.e., a "checked exception"), or
> > >> an application
> > >> >> exception class may be defined as a subclass of the
> > >> >> java.lang.RuntimeException (an "unchecked exception")
> > >> >>
> > >> >> 14.1.2 Goals for Exception Hand
> > >> >>
> > >> >> An application exception thrown by an enterprise bean
> > >> instance should
> > >> >> be reported to the client precisely (i.e., the client
> > >> gets the same
> > >> >> exception)
> > >> >>
> > >> >> 14.2.1 Application Exceptions
> > >> >>
> > >> >> An application exception that is an unchecked
> > exception
> > >> is defined as
> > >> >> an application exception by annotating it with the
> > >> >> applicationException metadata annotation.
> > >> >>
> > >> >> Thanks for your help,
> > >> >>
> > >> >>
> > >> >>
> > >> >> Antonio
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >>
> > >> >
> > >> >
> > >> >
> > ---------------------------------------------------------------------
> > >>
> > >> > To unsubscribe, e-mail:
> > >> ejb-unsubscribe_at_glassfish.dev.java.net
> > >> <mailto: ejb-unsubscribe_at_glassfish.dev.java.net>
> > >> > For additional commands, e-mail:
> > >> ejb-help_at_glassfish.dev.java.net
> > >> <mailto:ejb-help_at_glassfish.dev.java.net>
> > >> >
> > >>
> > >>
> > >>
> > >>
> > >>
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: ejb-unsubscribe_at_glassfish.dev.java.net
> > For additional commands, e-mail: ejb-help_at_glassfish.dev.java.net
> >
> >
>