Quarkus и DynamoDBMapper - «нет сопоставления для ключа HA SH» в собственной сборке - PullRequest
3 голосов
/ 04 марта 2020

У меня есть набор служб REST на основе Quarkus, которые используют 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)

Мой ключ HA SH четко сопоставлен с моим классом сущности, поэтому я не знаю, почему я ' Я получаю эту ошибку. Кто-нибудь может порекомендовать какие-либо советы по устранению неполадок или дать представление о том, что происходит?

1 Ответ

1 голос
/ 07 марта 2020

Вам необходимо зарегистрировать класс для отражения, чтобы он работал в основном режиме:

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

См .:

При создании собственного исполняемого файла GraalVM работает с допущением замкнутого мира. Он анализирует дерево вызовов и удаляет все классы / методы / поля, которые не используются напрямую.

Элементы, используемые с помощью отражения, не являются частью дерева вызовов, поэтому они исключаются из мертвого кода (если не вызывается непосредственно в другие случаи). Чтобы включить эти элементы в ваш собственный исполняемый файл, вам нужно явно зарегистрировать их для отражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...