EJBException et RMI
Nicolas Delsaux <[email protected]> Thu, 3 Nov 2011 14:52:40 +0100
| Newsgroups | gmane.comp.java.french.general |
|---|---|
| Message-ID | <CAOxcQsGn4Br5Qdrxc+MCFoxiA8myB30PT3=5VBUVkRxz+e-y+w@mail.gmail.com> |
Salut, depuis ce matin, je me chamaille avec un test unitaire Glassfish client qui m'affiche des erreurs RMI/IIOP/CORBA compl=E8tement dingues. Apr=E8s moult ivnestigations, j'en suis venu =E0 la conclusion qu'une exception arrive sur le serveur, et que cette exception ne passe pas dans les tuyaux de RMI. Maintenant, comment je peux corriger ? Bon, je vais quand m=EAme vous donner plus de d=E9tails. Depuis un client Glassfish, je r=E9cup=E8re l'interface distante d'un EJB qui stocke des donn=E9es dans une base Neo4J en utilisant Empire-RDF (https://github.com/mhgrove/Empire). Pas forc=E9ment conventionnel, mais sacr=E9ment fonctionnel. Sauf que, dans certains cas, je fais des b=EAtises (genre cr=E9er un objet qui existe d=E9ja en base). Dans ce cas-l=E0, c=F4t=E9 serveur, je vois =E7a : [#|2011-11-03T14:28:33.463+0100|WARNING|glassfish3.1.1|javax.enterprise.sys= tem.container.ejb.com.sun.ejb.containers|_ThreadID=3D223;_ThreadName=3DThre= ad-2;|A system exception occurred during an invocation on EJB TemplateEJB method public java.lang.Object AbstractCrudService.create(java.lang.Object) javax.ejb.EJBException at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContain= er.java:5193) at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5= 091) at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:48= 79) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2039= ) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990= ) at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvoc= ationHandler.java:213) at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObj= ectInvocationHandlerDelegate.java:79) at $Proxy531.create(Unknown Source) at sun.reflect.GeneratedMethodAccessor190.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesso= rImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(R= eflectiveTie.java:144) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(Reflective= Tie.java:174) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatc= hToServant(CorbaServerRequestDispatcherImpl.java:528) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatc= h(CorbaServerRequestDispatcherImpl.java:199) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRe= quest(CorbaMessageMediatorImpl.java:1624) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(C= orbaMessageMediatorImpl.java:1486) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(Cor= baMessageMediatorImpl.java:990) at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callba= ck(RequestMessage_1_2.java:214) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(C= orbaMessageMediatorImpl.java:742) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaM= essageMediatorImpl.java:539) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMes= sageMediatorImpl.java:2324) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.pe= rformWork(ThreadPoolImpl.java:497) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.ru= n(ThreadPoolImpl.java:540) Caused by: javax.persistence.EntityExistsException: java.lang.IllegalArgumentException: Entity already exists: Template id=3DRemoteTemplateJPATest#a template with an empty target name=3Da template with an empty target =09 at com.clarkparsia.empire.impl.EntityManagerImpl.persist(Unknown Source) at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(E= ntityManagerWrapper.java:269) at AbstractCrudService.create(AbstractCrudService.java:70) at AbstractCrudService.create(AbstractCrudService.java:22) at sun.reflect.GeneratedMethodAccessor187.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesso= rImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJB= SecurityManager.java:1052) at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSec= urityManager.java:1124) at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.jav= a:5366) at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(In= terceptorManager.java:800) at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInter= ceptor.java:57) at sun.reflect.GeneratedMethodAccessor163.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesso= rImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(I= nterceptorManager.java:861) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(In= terceptorManager.java:800) at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(Sys= temInterceptorProxy.java:162) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke= (SystemInterceptorProxy.java:144) at sun.reflect.GeneratedMethodAccessor162.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesso= rImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(I= nterceptorManager.java:861) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(In= terceptorManager.java:800) at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(Interc= eptorManager.java:370) at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:533= 8) at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5326) at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvoc= ationHandler.java:206) ... 18 more Caused by: java.lang.IllegalArgumentException: Entity already exists: Templ= ate id=3DRemoteTemplateJPATest#a template with an empty target name=3Da template with an empty target =09 at com.clarkparsia.empire.impl.EntityManagerImpl.assertNotContains(Unknown Source) ... 49 more |#] Le message est assez clair : "Entity already exists". Par contre, c=F4t=E9 client, je re=E7ois une exception tout sauf limpide : Avertissement: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream org.omg.CORBA.MARSHAL: Avertissement: 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(NativeConstructor= AccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingCon= structorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(C= orbaExtension.java:248) at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(C= orbaExtension.java:95) at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(W= rapperGenerator.java:387) at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperG= enerator.java:107) at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGen= erator.java:511) at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invok= e(CompositeInvocationHandlerImpl.java:99) at $Proxy54.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(CDRInputSt= ream_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(IIOPInputStre= am.java:2162) at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStre= am.java:2404) at com.sun.corba.ee.impl.io.IIOPInputStream.defaultReadObjectDelegate(IIOP= InputStream.java:596) at com.sun.corba.ee.impl.io.InputStreamHook.defaultReadObject(InputStreamH= ook.java:233) at java.lang.Throwable.readObject(Throwable.java:913) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.ja= va:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesso= rImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.sun.corba.ee.impl.io.IIOPInputStream.invokeObjectReader(IIOPInputSt= ream.java:1832) at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStream.ja= va:1214) at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStre= am.java:425) at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandle= rImpl.java:308) at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.ja= va: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(CDRInputSt= ream_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$ExceptionRW= RMIImpl.read(ExceptionHandlerImpl.java:180) at com.sun.corba.ee.impl.presentation.rmi.ExceptionHandlerImpl.readExcepti= on(ExceptionHandlerImpl.java:290) at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.read= Exception(DynamicMethodMarshallerImpl.java:502) at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privat= eInvoke(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(C= odegenStubBase.java:227) at __TemplateEJBInterface_Remote_DynamicStub.create(__TemplateEJBInterface= _Remote_DynamicStub.java) at _TemplateEJBInterface_Wrapper.create(_TemplateEJBInterface_Wrapper.java= ) at RemoteTemplateJPATest.aTemplateWithASimpleTargetShouldTotallyWork(Remot= eTemplateJPATest.java:97) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.ja= va:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesso= rImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMe= thod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCalla= ble.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMeth= od.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMetho= d.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.ja= va:28) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunne= r.java:76) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunne= r.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.ja= va:28) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4Te= stReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.j= ava:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteT= estRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteT= estRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRu= nner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestR= unner.java:197) Caused by: java.io.IOException: Mismatched serialization UIDs : Source (Rep. IDRMI:javax.ejb.EJBException:958C33FAE8798D83:E573C8C3FC5EB5E2) =3D E573C8C3FC5EB5E2 whereas Target (Rep. ID RMI:javax.ejb.EJBException:958C33FAE8798D83:0B0EB2FF36CB22F6) =3D 0B0EB2FF36CB22F6 at com.sun.corba.ee.impl.util.RepositoryId.useFullValueDescription(Reposit= oryId.java:679) at com.sun.corba.ee.impl.util.RepositoryId.useFullValueDescription(Reposit= oryId.java:639) at com.sun.corba.ee.impl.io.ValueHandlerImpl.useFullValueDescription(Value= HandlerImpl.java:360) at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStre= am.java:422) at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandle= rImpl.java:308) at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.ja= va:274) at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(= CDRInputStream_1_0.java:1015) ... 52 more D'apr=E8s ce que je comprend du bazar, =E7a devrait vouloir dire qu'un des =E9l=E9ments renvoy=E9s n'est pas s=E9rialisable. Ca n'est pas le cas de mon objet, que j'envoie d=E9ja =E0 travers RMI (et qui est donc s=E9rialis=E9). Ca n'est - =E0 priori - pas le cas des exceptions, piuisque Throwable impl=E9mente Serializable. Alors que reste-t-il de non s=E9rialisable ? Au cas o=F9 vous poseriez la question, le client s'ex=E9cute sur un JDK 1.7.0, comme Glassfish d'ailleurs (v=E9rifi=E9 avec JVisualVM). Il ne s'agit donc pas du classique probl=E8me de version diff=E9rente. --=20 Nicolas Delsaux