diff --git a/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/InvokeRequest.groovy b/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/InvokeRequest.groovy index 1b53e7c..1f08d24 100644 --- a/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/InvokeRequest.groovy +++ b/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/InvokeRequest.groovy @@ -1,6 +1,7 @@ package serverless.jvm.plugin import groovy.json.JsonOutput +import groovy.json.JsonSlurper import groovy.transform.Canonical import groovy.transform.CompileStatic import groovy.transform.Memoized @@ -34,6 +35,9 @@ class InvokeRequest { if (jsonOutput) { try { + if (null != result && result.getClass().isAssignableFrom(ByteArrayOutputStream.class)) { + result = new JsonSlurper().parse(((ByteArrayOutputStream)result).toByteArray()) + } if (serverlessOffline) { return JsonOutput.toJson(['__offline_payload__': result]) } else { @@ -51,6 +55,7 @@ class InvokeRequest { @Memoized static LambdaFunction load(long lastModified, File artifact, String handler) { final classLoader = LambdaClassLoader.getClassLoader(artifact) + Thread.currentThread().setContextClassLoader(classLoader) final lambda = LambdaFunction.create(handler, classLoader) return lambda } diff --git a/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/LocalInvocation.groovy b/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/LocalInvocation.groovy index cc76d56..98b8a76 100644 --- a/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/LocalInvocation.groovy +++ b/libs/java-invoke-local/src/main/groovy/serverless/jvm/plugin/LocalInvocation.groovy @@ -11,11 +11,21 @@ class LocalInvocation { static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) static invoke(LambdaFunction lambda, String input, String functionName = null) { + def event, context, exception + try { + final parsed = new JsonSlurper().parseText(input) + if (parsed.event && parsed.context) { + event = parsed.event + context = parsed.context + } + } catch (e) { + exception = e + } if (RequestStreamHandler.isAssignableFrom(lambda.clazz)) { - def inputStream = new ByteArrayInputStream(input.getBytes()) + def inputStream = new ByteArrayInputStream(null != event ? JsonOutput.toJson(event).getBytes() : input.getBytes()) def outputStream = new ByteArrayOutputStream() - lambda.instance."${lambda.method}"(inputStream, outputStream, mockContext(lambda)) + lambda.instance."${lambda.method}"(inputStream, outputStream, null != context ? newContext(context) : mockContext(lambda)) return outputStream } else { if (lambda.parameterType.isPrimitive() || isWrapperType(lambda.parameterType) || lambda.parameterType == String) { @@ -30,14 +40,7 @@ class LocalInvocation { } } - def event, context - try { - final parsed = new JsonSlurper().parseText(input) - if (parsed.event && parsed.context) { - event = parsed.event - context = parsed.context - } - } catch (e) { + if (null != exception) { throw new Exception("Unable to convert input \"${input}\" to ${lambda.parameterType.name}") } if (event && context) {