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