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