当前位置: 首页 > 知识库问答 >
问题:

Quarkus和DynamoDBMapper-在本机构建中“HASH密钥没有映射”

沈俊明
2023-03-14

我有一套基于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)

我的散列键被清晰地映射到实体类中,所以我不知道为什么会出现这个错误。有人能推荐一些故障排除技巧,或者提供一些关于发生了什么的见解吗?

共有1个答案

洪弘毅
2023-03-14

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

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

见:

  • QUARKUS-编写本机应用程序的技巧-注册反射

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

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

 类似资料:
  • 有可能在Java 16下构建本机Quarkus映像吗?没有找到任何操作说明。 不知何故,这应该是可能的,因为Oracle发布了对Java16的GraalVM支持(https://www.graalvm.org/release-notes/21_1/)

  • 我有以下简化设置: 4)应用程序.属性 当我使用本机maven配置文件(mvn clean package-pnative)运行该文件时,我得到: 使用--report-unsupport-elements-at-runtime运行它也没有太大帮助。当我删除MyEntity类时,它在Mac+GRAALVM-CE-Java11-20.0.0上成功地编译为本机可执行文件

  • 我正在尝试使用Github自托管运行程序为我的qukus应用程序构建原生映像。 这对我来说在Github托管的跑步者上非常有用,但我想在自托管的跑步者上这样做,这样我们就不会浪费Github的预算。 当我更新我的工作流程以使用自我托管的跑步者时,我开始遇到这个奇怪的异常。 我使用的是GraalVM 22.0.0.2、Java 11.0.14、Maven 3.8.4和Quarkus 2.7.5 我尝

  • Quarkus文档解释了如何使用Maven构建docker映像。但我在利用Gradle和Kotlin。我正在想办法做这些步骤: 首先,我想我想要一个包含gradle而不是maven的图像(Quay.io似乎没有)。然后,我必须考虑我还需要复制什么(而不是pom.xml),也许???其次,我相信这个图像也包含了GraalVM。所以我不确定我能在那里做些什么。 我必须使用Maven吗?我真的真的不想。

  • 在我的项目的根目录中,我发出了以下命令来创建一个特定于我的操作系统的本机可执行文件。有关详细信息,请参阅以下指南 这是输出。 本机映像生成失败,因为构建刚刚挂起。 我选择在主机上安装Graal VM,并选择非基于容器的方法,如下所示。 > ❯ brew安装——cask GRALVM/tap/GRALVM-ce-lts-java11 将Graal VM添加到JEnv管理的Java版本 ❯ jenv

  • 我正在尝试从Apple M1 Macbook为x86平台的本机docker容器构建Quarkus 2.8.0,并将其部署在Linuxamd64 Portainer中。我能够构建本机映像,并在检查文件时 输出为: 然后我使用文件构建docker容器,并使用以下命令推送到我的本地注册表: 构建过程在没有错误或警告的情况下成功完成,当我在本地注册表中检查时,容器被创建。 当我试图用Portainer在我