in aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java [452:519]
private static LambdaRequestHandler loadEventPojoHandler(HandlerInfo handlerInfo) {
Method[] methods;
try {
methods = handlerInfo.clazz.getMethods();
} catch (NoClassDefFoundError e) {
return new LambdaRequestHandler.UserFaultHandler(new UserFault(
"Error loading method " + handlerInfo.methodName + " on class " + handlerInfo.clazz.getName(),
e.getClass().getName(),
trace(e)
));
}
if (methods.length == 0) {
final String msg = "Class "
+ handlerInfo.getClass().getName()
+ " has no public method named "
+ handlerInfo.methodName;
return new UserFaultHandler(makeUserFault(msg));
}
/*
* We support the following signatures
* Anything (InputStream, OutputStream, Context)
* Anything (InputStream, OutputStream)
* Anything (OutputStream, Context)
* Anything (InputStream, Context)
* Anything (InputStream)
* Anything (OutputStream)
* Anything (Context)
* Anything (AlmostAnything, Context)
* Anything (AlmostAnything)
* Anything ()
*
* where AlmostAnything is any type except InputStream, OutputStream, Context
* Anything represents any type (primitive, void, or Object)
*
* prefer methods with longer signatures, add extra weight to those ending with a Context object
*
*/
int slide = 0;
for (int i = 0; i < methods.length; i++) {
Method m = methods[i];
methods[i - slide] = m;
if (!m.getName().equals(handlerInfo.methodName)) {
slide++;
continue;
}
}
final int end = methods.length - slide;
Arrays.sort(methods, 0, end, methodPriority);
for (int i = 0; i < end; i++) {
Method m = methods[i];
Optional<LambdaRequestHandler> result = getHandlerFromOverload(handlerInfo.clazz, m);
if (result.isPresent()) {
return result.get();
} else {
continue;
}
}
return new UserFaultHandler(makeUserFault("No public method named "
+ handlerInfo.methodName
+ " with appropriate method signature found on class "
+ handlerInfo.clazz.getName()));
}