Re: EJBException et RMI
Rémi Forax <[email protected]> Thu, 03 Nov 2011 15:07:07 +0100
| Newsgroups | gmane.comp.java.french.general |
|---|---|
| Message-ID | <[email protected]> |
On 11/03/2011 02:52 PM, Nicolas Delsaux wrote: > 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 E= JB > qui stocke des donn=E9es dans une base Neo4J en utilisant Empire-RDF > (https://github.com/mhgrove/Empire). Pas forc=E9ment conventionnel, mai= s > sacr=E9ment fonctionnel. > Sauf que, dans certains cas, je fais des b=EAtises (genre cr=E9er un ob= jet > 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= .system.container.ejb.com.sun.ejb.containers|_ThreadID=3D223;_ThreadName=3D= Thread-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(BaseCon= tainer.java:5193) > at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.ja= va:5091) > at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.jav= a:4879) > 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(EJBObjectI= nvocationHandler.java:213) > at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJ= BObjectInvocationHandlerDelegate.java:79) > at $Proxy531.create(Unknown Source) > at sun.reflect.GeneratedMethodAccessor190.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcc= essorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMeth= od(ReflectiveTie.java:144) > at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(Reflec= tiveTie.java:174) > at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dis= patchToServant(CorbaServerRequestDispatcherImpl.java:528) > at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dis= patch(CorbaServerRequestDispatcherImpl.java:199) > at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleReque= stRequest(CorbaMessageMediatorImpl.java:1624) > at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleReque= st(CorbaMessageMediatorImpl.java:1486) > at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput= (CorbaMessageMediatorImpl.java:990) > at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.ca= llback(RequestMessage_1_2.java:214) > at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleReque= st(CorbaMessageMediatorImpl.java:742) > at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(Co= rbaMessageMediatorImpl.java:539) > at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(Corb= aMessageMediatorImpl.java:2324) > at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThrea= d.performWork(ThreadPoolImpl.java:497) > at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThrea= d.run(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 Sourc= e) > at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persi= st(EntityManagerWrapper.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(DelegatingMethodAcc= essorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod= (EJBSecurityManager.java:1052) > at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJ= BSecurityManager.java:1124) > at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer= .java:5366) > at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) > at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNex= t(InterceptorManager.java:800) > at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) > at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanI= nterceptor.java:57) > at sun.reflect.GeneratedMethodAccessor163.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcc= essorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.interce= pt(InterceptorManager.java:861) > at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNex= t(InterceptorManager.java:800) > at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) > at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround= (SystemInterceptorProxy.java:162) > at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundIn= voke(SystemInterceptorProxy.java:144) > at sun.reflect.GeneratedMethodAccessor162.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcc= essorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.interce= pt(InterceptorManager.java:861) > at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNex= t(InterceptorManager.java:800) > at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(In= terceptorManager.java:370) > at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java= :5338) > at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5= 326) > at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectI= nvocationHandler.java:206) > ... 18 more > Caused by: java.lang.IllegalArgumentException: Entity already exists: T= emplate > id=3DRemoteTemplateJPATest#a template with an empty target > name=3Da template with an empty target > =09 > at com.clarkparsia.empire.impl.EntityManagerImpl.assertNotContains(Unk= nown > Source) > ... 49 more > |#] > > > Le message est assez clair : "Entity already exists". > Par contre, c=F4t=E9 client, je re=E7ois une exception tout sauf limpid= e : > > 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 Metho= d) > at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstru= ctorAccessorImpl.java:57) > at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Delegatin= gConstructorAccessorImpl.java:45) > at java.lang.reflect.Constructor.newInstance(Constructor.java:525) > at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeExcepti= on(CorbaExtension.java:248) > at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeExcepti= on(CorbaExtension.java:95) > at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLoggi= ng(WrapperGenerator.java:387) > at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(Wrap= perGenerator.java:107) > at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(Wrappe= rGenerator.java:511) > at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.i= nvoke(CompositeInvocationHandlerImpl.java:99) > at $Proxy54.valuehandlerReadException(Unknown Source) > at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueT= ype(CDRInputStream_1_0.java:1022) > at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInp= utStream_1_0.java:1123) > at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputOb= ject.java:531) > at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInput= Stream.java:2162) > at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInput= Stream.java:2404) > at com.sun.corba.ee.impl.io.IIOPInputStream.defaultReadObjectDelegate(= IIOPInputStream.java:596) > at com.sun.corba.ee.impl.io.InputStreamHook.defaultReadObject(InputStr= eamHook.java:233) > at java.lang.Throwable.readObject(Throwable.java:913) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImp= l.java:57) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcc= essorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at com.sun.corba.ee.impl.io.IIOPInputStream.invokeObjectReader(IIOPInp= utStream.java:1832) > at com.sun.corba.ee.impl.io.IIOPInputStream.inputObject(IIOPInputStrea= m.java:1214) > at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInput= Stream.java:425) > at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHa= ndlerImpl.java:308) > at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImp= l.java:274) > at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueT= ype(CDRInputStream_1_0.java:1015) > at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInp= utStream_1_0.java:1123) > at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputOb= ject.java:531) > at com.sun.corba.ee.impl.presentation.rmi.ExceptionHandlerImpl$Excepti= onRWRMIImpl.read(ExceptionHandlerImpl.java:180) > at com.sun.corba.ee.impl.presentation.rmi.ExceptionHandlerImpl.readExc= eption(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.pr= ivateInvoke(StubInvocationHandlerImpl.java:205) > at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.in= voke(StubInvocationHandlerImpl.java:152) > at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invo= ke(CodegenStubBase.java:227) > at __TemplateEJBInterface_Remote_DynamicStub.create(__TemplateEJBInter= face_Remote_DynamicStub.java) > at _TemplateEJBInterface_Wrapper.create(_TemplateEJBInterface_Wrapper.= java) > at RemoteTemplateJPATest.aTemplateWithASimpleTargetShouldTotallyWork(R= emoteTemplateJPATest.java:97) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImp= l.java:57) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcc= essorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(Framewo= rkMethod.java:44) > at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveC= allable.java:15) > at org.junit.runners.model.FrameworkMethod.invokeExplosively(Framework= Method.java:41) > at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeM= ethod.java:20) > at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefore= s.java:28) > at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassR= unner.java:76) > at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassR= unner.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(RunBefore= s.java:28) > at org.junit.runners.ParentRunner.run(ParentRunner.java:236) > at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUni= t4TestReference.java:50) > at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecuti= on.java:38) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Rem= oteTestRunner.java:467) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Rem= oteTestRunner.java:683) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTe= stRunner.java:390) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteT= estRunner.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(Rep= ositoryId.java:679) > at com.sun.corba.ee.impl.util.RepositoryId.useFullValueDescription(Rep= ositoryId.java:639) > at com.sun.corba.ee.impl.io.ValueHandlerImpl.useFullValueDescription(V= alueHandlerImpl.java:360) > at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInput= Stream.java:422) > at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHa= ndlerImpl.java:308) > at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImp= l.java:274) > at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueT= ype(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. > Le probl=E8me est pas que c'est pas Serializable mais que ton EjbExceptio= n=20 =E0 pas le m=EAme serialUID entre ta version server et ta version client. Bref, il faut que ton EjbException soit le m=EAme sur ton server et ton=20 client. Salut, R=E9mi