Метод сохранения AWS DynamoDBMapper продолжает генерировать `DynamoDBMappingException: не поддерживается; требует @DynamoDBTyped или @ DynamoDBTypeConverted` - PullRequest
1 голос
/ 13 марта 2019

Я следовал всему, что изложено здесь - https://github.com/derjust/spring-data-dynamodb/wiki/Use-Hash-Range-keys. Но все равно не повезло.

У меня есть таблица DynamoDB с ключом хеш-функции и ключом сортировки.

Вотмой класс сущности RecentlyPlayed.class

@DynamoDBTable(tableName="some-table")
public class RecentlyPlayed {

@Id
private RecentlyPlayedId recentlyPlayedId;

// ----- Constructor methods -----

@DynamoDBHashKey(attributeName="keyA")
// Getter and setter

@DynamoDBRangeKey(attributeName="keyB")
// Getter and setter

}

Вот мой ключевой класс RecentlyPlayedId.class

public class RecentlyPlayedId implements Serializable {

    private static final long serialVersionUID = 1L;

    private String keyA;

    private String keyB;

    public RecentlyPlayedId(String keyA, String keyB) {
        this.keyA = keyA;
        this.keyB = keyB;
    }

    @DynamoDBHashKey
    // Getter and setter

    @DynamoDBRangeKey
    // Getter and setter
}

Вот мой интерфейс хранилища RecentlyPlayedRepository

@EnableScan
public interface RecentlyPlayedRepository extends CrudRepository<RecentlyPlayed, RecentlyPlayedId> {

    List<RecentlyPlayed> findAllByKeyA(@Param("keyA") String keyA);

    // Finding the entry for keyA with highest keyB
    RecentlyPlayed findTop1ByKeyAOrderByKeyBDesc(@Param("keyA") String keyA);
}

Iя пытаюсь сохранить объект, подобный этому

RecentlyPlayed rp = new RecentlyPlayed(...);

dynamoDBMapper.save(rp);    // Throws that error

recentlyPlayedRepository.save(rp);  // Also throws the same error

Я использую Spring v2.0.1.RELEASE.Вики в оригинальной документации предупреждает об этой ошибке и описывает, что нужно сделать, чтобы смягчить.Я сделал именно то, что они сказали.Но все равно не повезло.

Ссылка на эту вики здесь - https://github.com/derjust/spring-data-dynamodb/wiki/Use-Hash-Range-keys

1 Ответ

1 голос
/ 14 марта 2019

DynamoDB поддерживает только примитивные типы данных, он не знает, как преобразовать ваше сложное поле (недавнийPlayedId) в примитив, такой как String.

Чтобы показать, что это так, вы можете добавить аннотацию @DynamoDBIgnore в свой атрибут недавнийPlayedId следующим образом:

@DynamoDBIgnore
private RecentlyPlayedId recentlyPlayedId;

Вам также необходимо удалить аннотацию @id.

Ваша функция сохранения будет работать, но недавний идентификатор воспроизведения не будет сохранен в элементе. Если вы хотите сохранить это поле, вам нужно использовать аннотацию @DynamoDBTypeConverted и написать класс конвертера. Класс преобразователя определяет, как преобразовать сложное поле в строку, а затем преобразовать строку в сложное поле.

...