Quarkus 和 DynamoDBMapper - 原生构建"no mapping for HASH key"



我有一套基于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;
  ...
}

我正在像这样在启动时创建我的表。。。

        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);

同样,在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)

我的HASH键被清晰地映射到实体类中,所以我不知道为什么会出现这个错误。有人能推荐任何故障排除技巧或深入了解发生了什么吗?

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

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

参见:

  • QUARKUS-编写本地应用程序的提示-注册以进行反射

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

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

相关内容

最新更新