我有一个使用micronaut-function-aws功能处理的简单Micronaut AWS lambda请求。
我注入的服务似乎不在AWS中运行时创建。
如果我执行整个groovy脚本函数处理程序并使用@Field @Singleton TestService testService,则在本地运行时似乎工作正常。
知道我在做什么错吗?
服务:
package testtest
import groovy.transform.CompileStatic
@CompileStatic
@Singleton
class TestService {
String test = "Test"
}
处理程序:
package testtest
import com.amazonaws.services.lambda.runtime.Context
import io.micronaut.function.aws.MicronautRequestStreamHandler
import javax.inject.Inject
class TestHandler extends MicronautRequestStreamHandler {
@Inject TestService testService
@Override
protected void execute(InputStream input, OutputStream output, Context context) throws IOException {
output << testService.test
}
}
AWS Lambda的堆栈跟踪
Cannot get property 'test' on null object: java.lang.NullPointerException
java.lang.NullPointerException: Cannot get property 'test' on null object
at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:60)
at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:190)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:304)
at testtest.TestHandler.execute(TestHandler.groovy:14)
at testtest.TestHandler.execute(TestHandler.groovy)
at io.micronaut.function.aws.MicronautRequestStreamHandler.handleRequest(MicronautRequestStreamHandler.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
答案 0 :(得分:0)
因此,我不确定使用MicronautRequestStreamHandler的正确方法,但是我找到了解决此问题的方法(或者只是正确的方法)。
我创建了一个新的Function @FunctionBean,然后通过重写MicronautRequestStreamHandler resolveFunctionName方法返回函数名称。
class AuthHandler extends MicronautRequestStreamHandler {
@Override
protected String resolveFunctionName(Environment environment) {
return "auth"
}
}
@FunctionBean('auth')
class AuthFunction implements Function<InputStream, AuthResponse> {
@Inject
AuthService authService
@Override
AuthResponse apply(InputStream input) {
// stuff etc
}
}
该函数正确注入服务。
真的只是复制他们如何测试MicronautRequestStreamHandler MicronautRequestStreamHandlerSpec.groovy
希望这对其他人有帮助...