gpt4 book ai didi

java - Quarkus 和 DynamoDBMapper - native 构建上的 "no mapping for HASH key"

转载 作者:行者123 更新时间:2023-12-02 05:59:49 24 4
gpt4 key购买 nike

我有一套基于 Quarkus 的 REST 服务,它们利用 DynamoDB 进行数据持久化。我已经使用 DynamoDBMapper 实现了此功能,并且在 JVM 模式下运行时我的代码没有任何问题。但是,当我尝试构建并运行 native 镜像时,我收到 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 模式下,此代码可以正常运行。但是,如果我构建 native 镜像并运行它,我会看到以下异常:

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

最佳答案

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

@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.

关于java - Quarkus 和 DynamoDBMapper - native 构建上的 "no mapping for HASH key",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60530529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com