You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-dev@hadoop.apache.org by Stefan Groschupf <sg...@media-style.com> on 2006/04/26 00:15:40 UTC

interfaces: NoSuchMethodException in RPC$Server.call

Hi,
I would love to use the RPC.getProxy but my Server uses Interfaces as  
parameter.
When I now invoke my proxy client with concrete implementation the  
server throws a java.io.IOException: java.lang.NoSuchMethodException,
at java.lang.Class.getMethod(Class.java:1581)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:237)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:218)
since call.getParameterClasses() returns the concrete classes and not  
the interfaces the classes implements.
Any idea how to workaround the problem?

Thanks.
Stefan




Re: interfaces: NoSuchMethodException in RPC$Server.call

Posted by Doug Cutting <cu...@apache.org>.
Stefan Groschupf wrote:
> If you like me and it make sense I can file a bug report with test  and 
> patch.

Yes, please.

Doug

Re: interfaces: NoSuchMethodException in RPC$Server.call

Posted by Stefan Groschupf <sg...@media-style.com>.
Hi,
yes I can but I already have a patch that at least solve me problem. :-)
What you think about this solution?
If you like me and it make sense I can file a bug report with test  
and patch.


Index: src/java/org/apache/hadoop/ipc/RPC.java
===================================================================
--- src/java/org/apache/hadoop/ipc/RPC.java	(revision 396952)
+++ src/java/org/apache/hadoop/ipc/RPC.java	(working copy)
@@ -233,9 +233,7 @@
          Invocation call = (Invocation)param;
          if (verbose) log("Call: " + call);

-        Method method =
-          implementation.getMethod(call.getMethodName(),
-                                   call.getParameterClasses());
+        Method method = findMethod(call);
          Object value = method.invoke(instance, call.getParameters());
          if (verbose) log("Return: "+value);
@@ -257,6 +255,30 @@
          throw ioe;
        }
      }
+
+    private Method findMethod(Invocation call) throws  
NoSuchMethodException {
+      Method[] methods = implementation.getMethods();
+      for (int i = 0; i < methods.length; i++) {
+        if (methods[i].getName().equals(call.getMethodName())) {
+          Class[] parameterTypes = methods[i].getParameterTypes();
+          Class[] parameterClasses = call.getParameterClasses();
+          if (parameterTypes.length == parameterClasses.length) {
+            boolean match = true;
+            for (int j = 0; j < parameterTypes.length; j++) {
+              if (!parameterTypes[j].isAssignableFrom 
(parameterClasses[j])) {
+                match = false;
+                break;
+              }
+            }
+            if (match) {
+              return methods[i];
+            }
+          }
+        }
+      }
+      throw new NoSuchMethodException();
+    }
+
    }
    private static void log(String value) {


On 26.04.2006, at 00:20, Doug Cutting wrote:

> Can you supply a simple test case?
>
> Thanks,
>
> Doug
>
> Stefan Groschupf wrote:
>> Hi,
>> I would love to use the RPC.getProxy but my Server uses Interfaces  
>> as  parameter.
>> When I now invoke my proxy client with concrete implementation  
>> the  server throws a java.io.IOException:  
>> java.lang.NoSuchMethodException,
>> at java.lang.Class.getMethod(Class.java:1581)
>>     at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:237)
>>     at org.apache.hadoop.ipc.Server$Handler.run(Server.java:218)
>> since call.getParameterClasses() returns the concrete classes and  
>> not  the interfaces the classes implements.
>> Any idea how to workaround the problem?
>> Thanks.
>> Stefan
>


Re: interfaces: NoSuchMethodException in RPC$Server.call

Posted by Doug Cutting <cu...@apache.org>.
Can you supply a simple test case?

Thanks,

Doug

Stefan Groschupf wrote:
> Hi,
> I would love to use the RPC.getProxy but my Server uses Interfaces as  
> parameter.
> When I now invoke my proxy client with concrete implementation the  
> server throws a java.io.IOException: java.lang.NoSuchMethodException,
> at java.lang.Class.getMethod(Class.java:1581)
>     at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:237)
>     at org.apache.hadoop.ipc.Server$Handler.run(Server.java:218)
> since call.getParameterClasses() returns the concrete classes and not  
> the interfaces the classes implements.
> Any idea how to workaround the problem?
> 
> Thanks.
> Stefan
> 
> 
>