SwitchYard RemoteInvoker Exception Handling
yusufb Dec 19, 2012 10:24 AMI've used the RemoteInvoker to link to a SwitchYard service successfully. The service interface declares that it throws an Exception and its implemented on the corresponding ServiceBean. However, when an Exception is thrown from the service on the server, the following error occurs on the client when using the RemoteInvoker to invoke the service:
java.lang.RuntimeException: java.lang.NoSuchMethodException: java.lang.StackTraceElement.<init>() at org.switchyard.common.type.reflect.Construction.construct(Construction.java:166) at org.switchyard.common.type.reflect.Construction.construct(Construction.java:71) at org.switchyard.serial.graph.DefaultFactory.create(DefaultFactory.java:37) at org.switchyard.serial.graph.node.AccessNode.decompose(AccessNode.java:133) at org.switchyard.serial.graph.Graph.decomposeReference(Graph.java:150) at org.switchyard.serial.graph.node.ArrayNode.decompose(ArrayNode.java:73) at org.switchyard.serial.graph.Graph.decomposeReference(Graph.java:150) at org.switchyard.serial.graph.node.AccessNode$1.run(AccessNode.java:145) at org.switchyard.serial.graph.Graph.decomposeRoot(Graph.java:136) at org.switchyard.serial.graph.GraphSerializer.deserialize(GraphSerializer.java:66) at org.switchyard.remote.http.HttpInvoker.invoke(HttpInvoker.java:130) at za.co.fnb.soa.registry.tests.remote.MyRemoteTests.myRemoteTest1(MyRemoteTests.java:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.lang.NoSuchMethodException: java.lang.StackTraceElement.<init>() at java.lang.Class.getConstructor0(Class.java:2706) at java.lang.Class.getDeclaredConstructor(Class.java:1985) at org.switchyard.common.type.reflect.Construction.construct(Construction.java:161) ... 34 more
It looks like the StackTraceElement doesn't have a default constructor, which seems to be required for deserialization. It's critical that Error information make it across to the client. Is there a workaround to get this working? Any other ideas?
Thanks,
Yusuf.