Нет метода или поля, аннотированного @DynamoDBHashKey, в типе java.lang.Строка

#java #amazon-web-services #nosql #spring-data #amazon-dynamodb

#java #amazon-web-services #nosql #spring-данные #amazon-dynamodb

Вопрос:

Я не знаю, почему не запускается этот проект.

 @Data
@DynamoDBTable(tableName = "tableName")
public class entityName implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    private String id;

    @DynamoDBRangeKey
    private String rk;

    private String sy;
}

Caused by: java.lang.IllegalArgumentException: No method or field annotated by @DynamoDBHashKey within type java.lang.String!
    at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBHashAndRangeKeyMethodExtractorImpl.<init>(DynamoDBHashAndRangeKeyMethodExtractorImpl.java:99) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.socialsignin.spring.data.dynamodb.repository.support.CompositeIdHashAndRangeKeyExtractor.<init>(CompositeIdHashAndRangeKeyExtractor.java:31) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBHashAndRangeKeyExtractingEntityMetadataImpl.getHashAndRangeKeyExtractor(DynamoDBHashAndRangeKeyExtractingEntityMetadataImpl.java:71) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBIdIsHashAndRangeKeyEntityInformationImpl.<init>(DynamoDBIdIsHashAndRangeKeyEntityInformationImpl.java:49) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityMetadataSupport.getEntityInformation(DynamoDBEntityMetadataSupport.java:125) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory.getEntityInformation(DynamoDBRepositoryFactory.java:104) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory.getDynamoDBRepository(DynamoDBRepositoryFactory.java:128) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBRepositoryFactory.getTargetRepository(DynamoDBRepositoryFactory.java:150) ~[spring-data-dynamodb-5.1.0.jar:5.1.0]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:305) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:211) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.util.Lazy.get(Lazy.java:94) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300) ~[spring-data-commons-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    ... 47 common frames omitted
 

Комментарии:

1. попробуйте задать вопрос подробнее.

2. Форматирование кода.

Ответ №1:

Я думаю, что проблема в этом бит:

 @DynamoDBRangeKey
private String rk;
 

Я заметил, что у вас есть @Id аннотация, что означает, что у вас, вероятно, есть хранилище данных Spring, выглядящее примерно так:

 @Repository
@EnableScan
public interface ServiceItemRepository extends CrudRepository<ServiceItem, String> {
}
 

@Id Аннотация является сигналом для Spring Data о том, что это является предметом String общего описания в объявлении репозитория. Но составные ключи, похоже, чертовски запутывают вещи. В принципе, если вы либо удалите @Id и не используете репозиторий здесь, либо замените @DynamoDBRangeKey на обычный @DynamoDBAttribute . Вы обнаружите, что все снова начинает работать.

Кстати: Ломбок не имеет никакого отношения к проблеме.

Ответ №2:

У вас должны быть геттеры и сеттеры для поля, как указано в документации:

Если аннотация применяется непосредственно к полю класса, соответствующие средства получения и установки должны быть объявлены в том же классе. https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBHashKey.html

Также взгляните на руководство разработчика: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper .Аннотации.html#DynamoDBMapper .Аннотации.DynamoDBHashKey

Комментарии:

1. Вы заметили аннотацию Project Lombok @Data ? Я думаю, что OP подумал бы, что получатели и установщики были бы предоставлены сгенерированными средствами доступа. Интересно, что это не распознается.

2. Lombok должен был сгенерировать средства доступа до выполнения, поэтому эффективно соответствующие средства получения и установки объявляются в одном классе.

3. Затем нужно проверить, существуют ли эти получатели (и установщики), прежде чем будут рассмотрены аннотации AWS.

4. Я хотел ответить на это, что я только что сделал — оказывается, что геттеры и сеттеры не были проблемой, но все еще немного странно, что это не работает. Я имею в виду, что я знаю основную причину, но не основную причину.

Ответ №3:

Как указал @michael-coxon, проблема связана с составными ключами. Поэтому вам нужно будет создать составной класс ключей, как описано здесь

https://github.com/derjust/spring-data-dynamodb/wiki/Use-Hash-Range-k