micronaut(2.3.2) w/ groovy と GORM を使うアプリで、ローカル環境だと動作するけどLambda上だと以下のようなエラーになった。
Lambdaは、Serverless Function ではく、Applicationとして構築している。
以下のようなエラー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Error starting Micronaut container: No GORM implementations configured. Ensure GORM has been initialized correctly: com.amazonaws.serverless.exceptions.ContainerInitializationException com.amazonaws.serverless.exceptions.ContainerInitializationException: Error starting Micronaut container: No GORM implementations configured. Ensure GORM has been initialized correctly at io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler.initialize(MicronautLambdaContainerHandler.java:259) at io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler.<init>(MicronautLambdaContainerHandler.java:153) at io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler.<init>(MicronautLambdaContainerHandler.java:128) at io.micronaut.function.aws.proxy.MicronautLambdaHandler.<init>(MicronautLambdaHandler.java:45) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source) Caused by: java.lang.IllegalStateException: No GORM implementations configured. Ensure GORM has been initialized correctly at org.grails.datastore.gorm.GormEnhancer.findSingleDatastore(GormEnhancer.groovy:378) at sdbackend.service.$SdmRoleGormServiceImplementation.getTargetDatastore(SdmRoleGormService.groovy) at sdbackend.service.$SdmRoleGormServiceImplementation.list(SdmRoleGormService.groovy) at sdbackend.Bootstrap$_onApplicationEvent_lambda3.doCall(Bootstrap.groovy:61) at java.base/java.util.Optional.orElseGet(Unknown Source) at sdbackend.Bootstrap.onApplicationEvent(Bootstrap.groovy:57) at sdbackend.Bootstrap.onApplicationEvent(Bootstrap.groovy) at io.micronaut.context.DefaultBeanContext.notifyEventListeners(DefaultBeanContext.java:1307) at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1292) at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:248) at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:166) at io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler.initialize(MicronautLambdaContainerHandler.java:239) ... 7 more |
solution
Lambda 経由だと、通常のmainがエントリーポイントではなく、Application の場合は MicronautLambdaHandler がエントリーポイントとなる。
Server function だと、MicronautRequestHandler もしくは、MicronautRequestStreamHandler になる。
MicronautLambdaHandler を拡張したクラスを作成して、GORMのDomain郡があるパッケージを指定してあげる。
1 2 3 4 5 6 7 8 9 |
class MyLambdaHandler extends MicronautLambdaHandler { MyLambdaHandler() throws ContainerInitializationException { super(ApplicationContext.build().packages("mypackage.domain")) } } |
とうまくいった。