весенние данные кассандры версия 2.1.4 нумерация страниц - PullRequest
0 голосов
/ 20 февраля 2019

Согласно документации: https://docs.spring.io/spring-data/cassandra/docs/2.1.4.RELEASE/reference/html/#repositories.limit-query-result

Данные весны Кассандры позволили легко получить информацию о нумерации страниц.Но я не могу заставить это работать.

Репо, Звонок и Ошибки:

1.Реактивный звонок

Репо :

public interface MyRepository extends ReactiveCassandraRepository<MyClass, String> {
  @Query("select * from my_keyspace.my_table where solr_query = ?0")
  Mono<Slice<MyClass>> findMono(String solrQuery, Pageable page);
}

Вызов:

 Mono<Slice<MyClass>>  repository.findMono(queryString, CassandraPageRequest.first(20));

Ошибка:

"exceptionDescription": "org.springframework.core.codec.CodecException: ошибка определения типа: [простой тип, класс com.datastax.driver.core.PagingState]; вложенное исключение равноcom.fasterxml.jackson.databind.exc.InvalidDefinitionException: не найден сериализатор для класса com.datastax.driver.core.PagingState и не обнаружено никаких свойств для создания BeanSerializer (во избежание исключения отключите SerializationFeature.FAIL_ON_EMPTY_BEANS) (через цепочку ссылок: org.springframework.data.domain.SliceImpl [\ "выгружаемая \"] -> org.springframework.data.cassandra.core.query.CassandraPageRequest [\ "pagingState \"]) " "линия": [" org.springframework.http.codec.json.AbstractJackson2Encoder.encodeValue (AbstractJackson2Encoder.java:175) " "org.springframework.http.codec.json.AbstractJackson2Encoder.lambda $ закодировать $ 0 (AbstractJackson2Encoder.java:122)"," reactor.core.publisher.FluxMaр $ MapSubscriber.onNext (FluxMap.java:100) " "reactor.core.publisher.FluxSwitchIfEmpty $ SwitchIfEmptySubscriber.onNext (FluxSwitchIfEmpty.java:67)"," reactor.core.publisher.FluxMap $ MapSubscriber.onNext (FluxMap.Java: 114) " "reactor.core.publisher.FluxDefaultIfEmpty $ DefaultIfEmptySubscriber.onNext (FluxDefaultIfEmpty.java:92)", "reactor.core.publisher.Operators $ MonoSubscriber.complete (Operators.java:1476)"," реактор.core.publisher.MonoFlatMap $ FlatMapInner.onNext (MonoFlatMap.java:241) " "reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext (FluxMapFuseable.java:121)"," reactor.core.publisher.Operators $ MonoSubscriber.complete (Operators.java:1476) " "reactor.core.publisher.MonoCollectList $ MonoBufferAllSubscriber.onComplete (MonoCollectList.java:118)"," reactor.core.publisher.FluxTake $ TakeFuseableSubscriber.onComplete (FluxTake.java:424) " "reactor.core.publisher.FluxTake $ TakeFuseableSubscriber.onNext (FluxTake.java:404)"," reactor.core.publisher.FluxIterable $ IterableSubscription.fastPath (FluxIterable.java:311)","reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:198)"],

2.Реактивен с ReactiveSortingRepository

Репо:

public interface LocationRepository extends ReactiveSortingRepository<MyClass, String> {
}

Вызов:

 repository.findAll(CassandraPageRequest.first(20))

Ошибка:

Синтаксическая ошибка: findAll не может быть применено к CassandraPageRequest.

3.Простой вызов, чтобы получить страницу.

Репо:

public interface MyRepository extends CassandraRepository<MyClass, MyClassKey> {
Page<MyClass> findByKeyTerminalIdAndSolrQuery(String solrQuery, Pageable page);
}

Ошибка при запуске:

Вызывается: org.springframework.dao.InvalidDataAccessApiUsageException: запросы страницы не поддерживаются.Используйте запрос Slice.

4.Использование PagingAndSortingRepository

Репо:

public interface MyRepository extends PagingAndSortingRepository<MyClass, MyClassKey> {

}

Вызов:

   Page<Vessel> vessels = repository.findAll(CassandraPageRequest.first(10));

Ошибка:

springframework.data.mapping.PropertyReferenceException: не найдено свойство findAll для типа MyClass!

1 Ответ

0 голосов
/ 20 февраля 2019

Добро пожаловать в переполнение стека.

Первый пример является подходящим:

public interface MyRepository extends ReactiveCassandraRepository<MyClass, String> {
  @Query("select * from my_keyspace.my_table where solr_query = ?0")
  Mono<Slice<MyClass>> findMono(String solrQuery, Pageable page);
}

Mono<Slice<MyClass>>  repository.findMono(queryString, CassandraPageRequest.first(20));

Проблема в том, что Джексон не может кодировать SliceImpl (реализация Slice), когда вы передаете его в WebFlux (согласно трассировке стека).Таким образом, запрос дает правильный результат, но вам нужно передать контент Slice, а не сам Slice, если вы хотите JSON-кодировать его.

В связанной заметке: ReactiveCassandraRepository нереализовать ReactiveSortingRepository, потому что запросы Casandra с аргументом Sort всегда требуют предложения WHERE.Глядя на ReactiveSortingRepository, вы увидите findAll(Sort) метод, который не принимает критерий фильтра:

public interface ReactiveSortingRepository<T, ID> extends ReactiveCrudRepository<T, ID> {
    Flux<T> findAll(Sort sort);
}
...