Quarkus 和 DynamoDBMapper - 本机构建 "no mapping for HASH key"

Quarkus and DynamoDBMapper - "no mapping for HASH key" on native build

我有一套基于 Quarkus 的 REST 服务,它们利用 DynamoDB 实现数据持久化。我已经使用 DynamoDBMapper 实现了这个,并且在 JVM 模式下 运行ning 时我的代码没有问题。但是,当我尝试构建 运行 原生图像时,出现 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;

  ...

}

我正在像这样在启动时创建我的 table...

        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 键清楚地映射到我的实体 class 中,所以我不知道为什么会出现此错误。任何人都可以推荐任何故障排除技巧或提供任何有关正在发生的事情的见解吗?

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

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

参见:

When building a native executable, GraalVM operates with a closed world assumption. It analyzes the call tree and removes all the classes/methods/fields that are not used directly.

The elements used via reflection are not part of the call tree so they are dead code eliminated (if not called directly in other cases). To include these elements in your native executable, you need to register them for reflection explicitly.