Нет метода или поля, аннотированного @DynamoDBHashKey в типе java.lang.String - PullRequest
0 голосов
/ 18 апреля 2019

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

@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

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Я думаю, что проблема заключается в следующем:

@DynamoDBRangeKey
private String rk;

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

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

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

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

0 голосов
/ 18 апреля 2019

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

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

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

...