我有一套基于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使用封闭世界假设进行操作。它分析调用树并删除所有未直接使用的类/方法/字段。
通过反射使用的元素不是调用树的一部分,因此它们是死代码消除的(如果在其他情况下不直接调用(。要在本机可执行文件中包含这些元素,需要明确地注册它们以进行反射。