From c11c9efe2161cf02b9da1d574d71962996c830a3 Mon Sep 17 00:00:00 2001 From: Lasantha Kularatne Date: Fri, 4 Oct 2019 14:13:16 -0500 Subject: [PATCH] Issue 4867 - Allowing InvokeBridge to find handleRequest method from super classes --- .../java/com/serverless/InvokeBridge.java | 2 +- .../serverless/AbstractRequestHandler.java | 16 ++++++++++++++ .../serverless/ConcreteRequestHandler.java | 10 +++++++++ .../InvokeBridgeInheritanceTest.java | 22 +++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/AbstractRequestHandler.java create mode 100644 lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/ConcreteRequestHandler.java create mode 100644 lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/InvokeBridgeInheritanceTest.java diff --git a/lib/plugins/aws/invokeLocal/java/src/main/java/com/serverless/InvokeBridge.java b/lib/plugins/aws/invokeLocal/java/src/main/java/com/serverless/InvokeBridge.java index 3fcf66def..8a4d32c93 100644 --- a/lib/plugins/aws/invokeLocal/java/src/main/java/com/serverless/InvokeBridge.java +++ b/lib/plugins/aws/invokeLocal/java/src/main/java/com/serverless/InvokeBridge.java @@ -105,7 +105,7 @@ public class InvokeBridge { private Method findHandlerMethod(Class clazz, String handlerName) throws Exception { Method candidateMethod = null; - for(Method method: clazz.getDeclaredMethods()) { + for(Method method: clazz.getMethods()) { if (method.getName().equals(handlerName) && !method.isBridge()) { // Select the method with the largest number of parameters // If two or more methods have the same number of parameters, AWS Lambda selects the method that has diff --git a/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/AbstractRequestHandler.java b/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/AbstractRequestHandler.java new file mode 100644 index 000000000..827a557f8 --- /dev/null +++ b/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/AbstractRequestHandler.java @@ -0,0 +1,16 @@ +package com.serverless; + +import java.util.Map; + +import com.amazonaws.services.lambda.runtime.Context; + +public abstract class AbstractRequestHandler + implements com.amazonaws.services.lambda.runtime.RequestHandler, Object> { + + abstract Object handleMe(); + + @Override + public Object handleRequest(Map stringObjectMap, Context context) { + return "Parent Complete.|" + handleMe(); + } +} diff --git a/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/ConcreteRequestHandler.java b/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/ConcreteRequestHandler.java new file mode 100644 index 000000000..9c5ea2cbc --- /dev/null +++ b/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/ConcreteRequestHandler.java @@ -0,0 +1,10 @@ +package com.serverless; + +public class ConcreteRequestHandler extends AbstractRequestHandler { + + @Override + Object handleMe() { + return "Child Complete."; + } + +} diff --git a/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/InvokeBridgeInheritanceTest.java b/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/InvokeBridgeInheritanceTest.java new file mode 100644 index 000000000..15af0816c --- /dev/null +++ b/lib/plugins/aws/invokeLocal/java/src/test/java/com/serverless/InvokeBridgeInheritanceTest.java @@ -0,0 +1,22 @@ +package com.serverless; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; + +public class InvokeBridgeInheritanceTest { + @Before + public void before() { + System.setProperty("artifactPath", "target/test-classes/com/serverless/ConcreteRequestHandler.class"); + System.setProperty("className", "com.serverless.ConcreteRequestHandler"); + System.setProperty("handlerName", "handleRequest"); + } + + @Test + public void verifyInvoke() { + System.setIn(getClass().getResourceAsStream("/test.json")); + InvokeBridge.main(new String[] {}); + // Nothing to verify, if this doesn't throw NoSuchMethodException, we are good. + } +}