Как мне установить ключ разделения для CosmosDb в Spring Boot - PullRequest
1 голос
/ 20 марта 2019

Ответ может показаться очевидным, но я пробовал множество комбинаций аннотаций и конфигураций и не могу найти способ реализовать это, который работает во всех случаях (например, возможность делать CRUD, DocumentDbRepository и пользовательские методы).

Пример аннотации:

@Data
@...
@Document(collection="items")
public class Item {
   @Id
   private String itemId;
   @PartitionKey
   private String storeNumber;
   ...
}

Пример конфигурации:

...
    public DocumentClient config() {
      DocumentClient client = new DocumentClient(
            uri, key, getConnectionPolicy(), ConsistencyLevel.Session);

        client.readDatabases(new FeedOptions()).getQueryIterator().forEachRemaining(database -> {
            System.out.println("Spring database link = " + database.getSelfLink());
        });

        /*
        DocumentCollection coll = new DocumentCollection();
        coll.setId("itemId");
// Corrected based on Sajeetharan's answer:
        PartitionKeyDefinition partitionKeyDefinition = new  PartitionKeyDefinition();
        Collection<String> paths = new ArrayList<>();
        partitionKeyDefinition.setPaths(paths);
        paths.add("storeNumber");
        coll.setPartitionKey(partitionKeyDefinition);
        coll.setResourceId("items");

        // OR

        RequestOptions options = new RequestOptions();
        options.setPartitionKey(new PartitionKey("clubNumber"));

        try {
            client.createCollection(String.format("/dbs/%s", DATABASE), coll, options);
        } catch (DocumentClientException e) {
            e.printStackTrace();
        }
        */

        return client;
    }
...

Пока мой код работает, когда я разрешаю Microsoft обработать для меня ключ раздела и просто указать @Idполе вместе с конфигурацией клиента.Тем не менее, я хочу использовать конкретный ключ раздела в этом случае.Приведенные выше примеры являются лишь небольшим примером различных комбинаций, которые я пытался реализовать, чтобы заставить это работать.Тем не менее, я получаю исключения: java.lang.UnsupportedOperationException: PartitionKey value must be supplied for this operation для чего-то такого простого, как findById().С учетом сказанного, я был бы признателен за помощь в поиске решения для этого.

Для записи, каждый из трех приведенных примеров создаст коллекцию для меня при загрузке Spring после удаления коллекции в пользовательском интерфейсе Azure.,А в настройках ключ раздела показан как '/ storeNumber', правильный ключ раздела, который я не задавал вручную в пользовательском интерфейсе Azure.Это не позволяет мне понять, почему компилятор жалуется на то, что я не предоставил ключ раздела, хотя Spring Boot непосредственно отвечает за создание коллекции с (правильным) ключом раздела, который я вижу в пользовательском интерфейсе Azure.

Я использую:

        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-documentdb</artifactId>
            <version>LATEST</version> 
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>spring-data-cosmosdb</artifactId>
            <version>2.1.1</version>
        </dependency> <!-- mainly needed for @Id -->

в моем POM.

*** Буду признателен, если кто-то поможет мне в том, что я должен сделать сейчас, когда мой вопрос решен,Если уместно отметить вопрос как дублирующий или полностью исключить вопрос, я с удовольствием это сделаю, но я чувствую, что это может быть полезно для кого-то другого.А пока я отвечу на свой вопрос, поскольку данный ответ не разрешил его напрямую, хотя ссылка, приведенная в комментарии, очень помогла.

Ответы [ 2 ]

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

Вы должны установить так,

 PartitionKeyDefinition partitionKeyDefinition = new PartitionKeyDefinition();
 Collection<String> paths = new ArrayList<>();
 paths.add(partitionKey);
 partitionKeyDefinition.setPaths(paths);
 collection.setPartitionKey(partitionKeyDefinition);
0 голосов
/ 21 марта 2019

Как я уже сказал в своем вопросе, все (CRUD / DocumentDbRepository / Custom методы) работало нормально до использования аннотации @PartitionKey для выбора собственного ключа раздела, а не для того, чтобы Microsoft управляла им для меня. Хотя сохранение и удаление продолжали работать нормально, методы DocumentDbRespository, такие как findById(String id) и т. Д., Выдавали UnsupportedOperationException и жаловались на необходимость предоставления ключа раздела. Первоначально это вызывало недоумение, поскольку ключ разделения был предоставлен при загрузке Spring и был зарегистрирован в базе данных cosmos, созданной при загрузке Spring. Решением было предоставить сигнатуры методов в хранилище, которое отображало имена полей. Например подпись в:

public interface TransactionRepository extends DocumentDbRepository<Transaction, String> {
   public List<Transaction> findByTxId(String txId);
}

работал как положено, тогда как эта подпись:

public Optional<Transaction> findById(String id)

вызовет исключение.

Для получения дополнительной информации см. Комментарии в ответе Саджитхарана. Кроме того, Джей Гонг дает отличное объяснение, отвечая на вопрос Нихила Джайна, найденный здесь: Для этой операции необходимо указать значение PartitionKey .

...