#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