@DynamoDBIndexHashKey должен указывать одно из имени / имен HASH GSI

Мой класс таков, как следует

@DynamoDBTable(tableName = LogConstant.TableName)
public class Journal {

@DynamoDBIndexHashKey(attributeName = "event_type")
private String eventType;

@DynamoDBIndexHashKey(attributeName = "user_id",globalSecondaryIndexName = LogConstant.GlobalUserIdIndex)
private String userId;

@DynamoDBIndexHashKey(attributeName = "user_identifier", globalSecondaryIndexName = LogConstant.GlobalUserIdentifierIndex)
private String userIdentifier;

@DynamoDBIndexHashKey(attributeName = "order_id", globalSecondaryIndexName = LogConstant.GlobalOrderIdIndex)
private String orderId;

@DynamoDBTypeConvertedEnum
@DynamoDBAttribute(attributeName = "generated_by")
private GenertionType generatedBy;

@DynamoDBTypeConvertedEnum
@DynamoDBHashKey(attributeName = "interacting_service")
private InteractingService interactingSerice;

@DynamoDBAttribute(attributeName = "agent")
private String agent;

@DynamoDBAttribute(attributeName = "content")
private String content;

@DynamoDBRangeKey
@DynamoDBIndexRangeKey(attributeName = "created_at",
        globalSecondaryIndexNames = {LogConstant.GlobalUserIdIndex,LogConstant.GlobalUserIdentifierIndex,LogConstant.GlobalOrderIdIndex})
private String createdAt;

Сервис, получающий результат поиска, это

DynamoDBQueryExpression<Journal> expression = new 
DynamoDBQueryExpression<Journal>()
            .withIndexName(LogConstant.GlobalUserIdIndex)
            .withConsistentRead(false)
            .withHashKeyValues(journal);

    TableDescription table = DynamoDbStarter.getDynamoDB().getTable(LogConstant.TableName).describe();

    return DynamoDbStarter.getDynamoDBMapper().query(Journal.class, expression);

Хотя вставка работает нормально, но во время получения результата я получаю исключение

com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: @DynamoDBIndexHashKey must specify one of HASH GSI name/names
at com.amazonaws.services.dynamodbv2.datamodeling.StandardAnnotationMaps$FieldMap.globalSecondaryIndexNames(StandardAnnotationMaps.java:345) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel$Properties$Immutable.<init>(DynamoDBMapperFieldModel.java:459) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties$Bean.<init>(StandardBeanProperties.java:92) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties$Bean.<init>(StandardBeanProperties.java:86) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties$BeanMap.putOrFlatten(StandardBeanProperties.java:217) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties$BeanMap.putAll(StandardBeanProperties.java:207) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties$BeanMap.<init>(StandardBeanProperties.java:198) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties$CachedBeans.getBeans(StandardBeanProperties.java:55) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties$CachedBeans.access$100(StandardBeanProperties.java:48) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardBeanProperties.of(StandardBeanProperties.java:42) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$TableBuilder.<init>(StandardModelFactories.java:132) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$TableBuilder.<init>(StandardModelFactories.java:116) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$StandardTableFactory.getTable(StandardModelFactories.java:107) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.getTableModel(DynamoDBMapper.java:393) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.createQueryRequestFromExpression(DynamoDBMapper.java:1626) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.query(DynamoDBMapper.java:1503) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.query(AbstractDynamoDBMapper.java:265) ~[aws-java-sdk-dynamodb-1.11.172.jar:na]
at com.furlenco.platform.loggingservice.service.impl.LogServiceimpl.getLogsBasedOnSecondaryIndexUserId(LogServiceimpl.java:86) ~[classes/:na]
at com.furlenco.platform.loggingservice.service.impl.LogServiceimpl.getEventLogsForUserId(LogServiceimpl.java:67) ~[classes/:na]

У меня есть таблица с хеш-ключом как intecting_service и ключом диапазона как CreatedDate. Я пытаюсь получить результат от GSI, но почему-то это приводит к исключению Может ли кто-нибудь увидеть, что я делаю неправильно?

eventType имеет аннотацию @DynamoDBIndexHashKey, но в аннотации отсутствует индексное имя. Если вы хотите, чтобы eventType был хеш-ключом основной таблицы, вам нужно использовать @DynamoDBHashKey.

Matthew Pope 02.08.2018 08:17

Извините, я ошибочно упомянул тип события, это взаимодействующая служба с аннотацией @DynamoDBHashKey. Я обновил вопрос извините

sid297 02.08.2018 08:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
3 288
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В вашем сообщении об исключении говорится

@DynamoDBIndexHashKey must specify one of HASH GSI name/names

Если вы посмотрите на все аннотации @DynamoDBIndexHashKey в вашем классе, вы увидите, что все они устанавливают значение для globalSecondaryIndexName, за исключением аннотации на eventType. Если предполагается, что eventType является хеш-ключом GSI, вам необходимо установить это значение. Если eventType не должен быть хеш-ключом GSI, вам необходимо удалить аннотацию @DynamoDBIndexHashKey из этого поля.

См. javadoc для получения более подробной информации об использовании @DynamoDBImdexHashKey.

Привет, спасибо. Я пропустил это. Еще раз спасибо

sid297 02.08.2018 15:15

Он должен выглядеть так> @get: DynamoDBIndexHashKey (attributeName = "product", globalSecondaryIndexName = "product-index")> var product: String? = ноль

RBrink 20.09.2019 11:43

Должно получиться так:

@get:DynamoDBIndexHashKey(attributeName = "product", globalSecondaryIndexName = "product-index")
var product: String? = null

Добавьте это также к определению БД:

CreateTableRequest()

 ...

 .withGlobalSecondaryIndexes(GlobalSecondaryIndex()
            .withIndexName(PRODUCT_INDEX)
            .withKeySchema(
               KeySchemaElement(PRODUCT, KeyType.HASH),
               KeySchemaElement(PRODUCT_RANGE, KeyType.RANGE))
            .withProjection(Projection().withProjectionType(ProjectionType.ALL))
            .withProvisionedThroughput(ProvisionedThroughput(1L, 2L)))  

Другие вопросы по теме