Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Lanzar Excepcion personalizada en un EJB

Buenas noches a todos, pido su colaboración con el siguiente tema, dado que no he encontrado respuesta en la web y he realizado arduas busquedas.

Como puedo lanzar una excepción personalizada en un EJB y capturarla en una aplicación cliente?

Lo que hice fue crear una clase "public class MiExcepcion extends EJBException" y lanzo una excepción de este tipo en un método del EJB, cuando hago el correspondiente llamado a dicho método desde el cliente capturo la excepción así "catch(MiException e)" pero me muestra el siguiente error:

Por favor les suplico y agradezco que me colaboren.

abr 26, 2012 12:46:29 AM com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator handleFullLogging
Advertencia: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream
org.omg.CORBA.MARSHAL: Advertencia: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream vmcid: OMG minor code: 11 completed: Maybe
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
at $Proxy34.valuehandlerReadException(Unknown Source)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1022)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1123)
at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:2162)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2404)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1224)
at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:425)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:308)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:274)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1015)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1123)
at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:2162)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2404)
at com.sun.corba.ee.impl.io.IIOPInputStream.defaultReadObjectDelegate(IIOPInputStream.java:596)
at com.sun.corba.ee.impl.io.InputStreamHook.defaultReadObject(InputStreamHook.java:233)
at java.lang.Throwable.readObject(Throwable.java:913)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.corba.ee.impl.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1832)
at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.java:1214)
at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:425)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:308)
at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:274)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:1015)
at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1123)
at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
at com.sun.corba.ee.impl.presentation.rmi.ExceptionHandlerImpl$ExceptionRWRMIImpl.read(ExceptionHandlerImpl.java:180)
at com.sun.corba.ee.impl.presentation.rmi.ExceptionHandlerImpl.readException(ExceptionHandlerImpl.java:290)
at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readException(DynamicMethodMarshallerImpl.java:502)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:227)
at EJB.System.UserBL.__UserBLRemote_Remote_DynamicStub.LogOn(EJB/System/UserBL/__UserBLRemote_Remote_DynamicStub.java)
at EJB.System.UserBL._UserBLRemote_Wrapper.LogOn(EJB/System/UserBL/_UserBLRemote_Wrapper.java)

abril 26, 2012 | Unregistered CommenterGerman Rojas

¿Qué versión de EJB estás usando? ¿Es interfaz local o remota?

abril 26, 2012 | Registered Commenterantoniovl

Te agradezco mucho por responder, Estoy utilizando la versión EJB 3, y la interfaz es remota por que hago el llamo al EJB desde una aplicación cliente Swing.

En el EJB definí el método "LogOn" para validar el inicio de sesión de un usuario, en caso que el usuario o contraseña sean incorrectos, lanzo una excepción personalizada "MiException" que hereda de "EJBExcepcion" y que tiene información personalizada del error, pero en el cliente si capturo la Excepción así:
"catch(MiException e){ ... }"
"catch(EJBException e){...}"
la excepción es atrapada en el catch "EJBException" y pierdo la información personalizada del error, pero si no coloco el "catch(EJBException e)" me lanza el error que copie en el post original....
Espero que me puedan ayudar, cualquier pregunta por favor no duden en comentarme, si es necesario subo el código... Muchas Gracias de antemano

abril 26, 2012 | Unregistered CommenterGerman Rojas

Te recomiendo que no lances una exception para indicar un error en el usuario o contraseña. Define mejor una clase tipo "LoginResult" que mínimamente contenga una propiedad boolean "loginCorrecto" y una propiedad String donde enviarás a la capa de presentación un mensaje de error o de lo que quieras.

Respecto a tu problema específico, haz que tu exception extienda RemoteException e inténtalo nuevamente.

abril 26, 2012 | Registered Commenterantoniovl

Muchas gracias por Tu colaboración ya he intentado todo, ya intente heredando mi excepcion de remote exception y nada, agradezco tu sugerencia, pero quiero hacerlo lanzando una excepción.... Por favor ayuda, he buscado probado y fallado durante días con este problema...

abril 27, 2012 | Unregistered CommenterGerman Rojas

Perdona que insista en que no arrojes una instancia de EJBException. Por favor checa este thread en stackoverflow.com. En tu caso no se trata de un error inesperado o irrecuperable, además que vas a tener que poner mucha atención en el manejo de la transacción. Por ejemplo si llevas el registro de las veces que el usuario ha intentado ingresar sin éxito al sistema y lo guardas en la base de datos, la presencia de una exception va a meter mucho ruido.

abril 27, 2012 | Registered Commenterantoniovl