Quarkus 和 DynamoDBMapper - 本机构建上“没有 HASH 键映射”

Sha*_*man 5 java amazon-dynamodb graalvm quarkus

我有一套基于 Quarkus 的 REST 服务,它们利用 DynamoDB 进行数据持久化。我已经使用它实现了这一点DynamoDBMapper,并且在 JVM 模式下运行时我的代码没有任何问题。但是,当我尝试构建并运行本机映像时,我收到 DynamoDB 映射错误。

我的实体代码如下所示:

@DynamoDBTable(tableName = "MyTable")
public class MyEntity {

    /**
     *
     */
    private static final long serialVersionUID = -4532872175331494789L;

    @DynamoDBHashKey(attributeName = "pk")
    private String partitionKey = null;

    @DynamoDBRangeKey(attributeName = "sk")
    private String rangeKey = null;

  ...

}
Run Code Online (Sandbox Code Playgroud)

我在启动时创建我的表,如下所示......

        AmazonDynamoDB client = ...
        DynamoDB dynamoDB = new DynamoDB(client);

        String accessKey = "xxx";
        String secretKey = "yyy";

        AWSCredentials creds = new BasicAWSCredentials(accessKey, secretKey);
        AWSCredentialsProvider credProvider = new AWSStaticCredentialsProvider(creds);

        DynamoDBMapper mapper = new DynamoDBMapper(client, credProvider);

        CreateTableRequest req = mapper.generateCreateTableRequest(MyEntity.class);
        client.createTable(req);
Run Code Online (Sandbox Code Playgroud)

同样,在 JVM 模式下,此代码可以正常运行。但是,如果我构建本机映像并运行它,我会看到以下异常:

11:20:48 ERROR [io.quarkus.application] Failed to start application: com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: MyEntity; no mapping for HASH key
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel.hashKey(DynamoDBMapperTableModel.java:119)
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel$Builder.build(DynamoDBMapperTableModel.java:449)
    at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$StandardTableFactory.getTable(StandardModelFactories.java:107)
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.getTableModel(DynamoDBMapper.java:408)
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.generateCreateTableRequest(DynamoDBMapper.java:2268)
    at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.generateCreateTableRequest(AbstractDynamoDBMapper.java:339)
    at com.myapp.persistence.DynamoDBTableInitializer.observeStartup(DynamoDBTableInitializer.java:93)
    at com.myapp.persistence.DynamoDBTableInitializer_Observer_observeStartup_988ebae54ee676255a64ec2d4203a1bb713ccc8e.notify(DynamoDBTableInitializer_Observer_observeStartup_988ebae54ee676255a64ec2d4203a1bb713ccc8e.zig:111)
    at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:282)
    at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:267)
    at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:69)
    at io.quarkus.arc.runtime.LifecycleEventRunner.fireStartupEvent(LifecycleEventRunner.java:23)
    at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:108)
    at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent78.deploy_0(LifecycleEventsBuildStep$startupEvent78.zig:77)
    at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent78.deploy(LifecycleEventsBuildStep$startupEvent78.zig:36)
    at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:285)
    at io.quarkus.runtime.Application.start(Application.java:87)
    at io.quarkus.runtime.Application.run(Application.java:210)
    at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:41)
Run Code Online (Sandbox Code Playgroud)

我的哈希键清楚地映射在我的实体类中,所以我不知道为什么会收到此错误。任何人都可以推荐任何故障排除技巧或提供对正在发生的事情的任何见解吗?

Eng*_*uad 3

您需要注册反射类才能在本机模式下工作:

@RegisterForReflection
@DynamoDBTable(tableName = "MyTable")
public class MyEntity {
Run Code Online (Sandbox Code Playgroud)

看:

在构建本机可执行文件时,GraalVM 在封闭世界假设下运行。它分析调用树并删除所有不直接使用的类/方法/字段。

通过反射使用的元素不是调用树的一部分,因此它们被消除为死代码(如果在其他情况下不直接调用)。要将这些元素包含在本机可执行文件中,您需要显式注册它们以进行反射。