2016-10-25 19 views
6

Chcę użyć Cassandra 3.x w projekcie Spring Boot. Dowiedziałem się, że obecna wersja projektu Spring Data Cassandra obsługuje tylko Cassandrę 2.x. Tak więc chciałem użyć sterownika DataStax zamiast projektu Spring Data Cassandra. Dodałem jako zależność. Teraz mogę wstawiać wartości do obszaru kluczy w klastrze Cassandra. Ale gdy uruchomiony testy dla kontrolera REST pojawia się błądSpring Boot 1.4.1 i Cassandra 3.x

java.lang.NoClassDefFoundError: io/netty/handler/codec/http/FullHttpRequest 

więc dodałem

compile 'io.netty:netty-all:4.1.6.Final' 

jako zależność a błąd odszedł. Ale teraz wszystkie testy z użyciem

TestRestTemplate.postForObject(...) 

lub

TestRestTemplate.put(...) 

niepowodzeniem. Ale użycie

działa zgodnie z oczekiwaniami. Zakładam, że istnieje pewien konflikt w zależnościach Spring Boot i wersji Netty dodanej jako zależność.

Dowiedziałem się, że najnowsza wersja sterownika DataStax Cassandra do pracy bez dodatkowej zależności Netty to 2.1.5, która jest datowana na marzec 2015 i nie obsługuje Cassandry 3. Używanie tego sterownika wszystko działa, ale ja nie chcesz użyć starego sterownika.

UPDATE: Usunąłem zależność sterownika DataStax i próbowałem użyć wersji Spring Data Cassandra w wersji 1.5.0.M1 i przeskoczyłem wersje sterowników Spring, Spring Data Cassandra i Cassandra w buildscript.

ext['spring.version'] = '5.0.0.M2' 
ext['spring-data-releasetrain.version'] = 'Ingalls-M1' 
ext['cassandra-driver.version'] = '3.1.1' 

Spowodowało następującego błędu:

java.lang.NoClassDefFoundError: io/netty/util/Timer 

podczas korzystania z funkcjonalności Cassandra. Kiedy ponownie włączę Netty, funkcjonalność Cassandra działa, ale moje testy z użyciem TestRestTemplate.put i .post nie są już uruchomione. Dałem mu kolejną próbę uaktualnienia do Spring Boot w wersji 2.0.0.BUILD-SNAPSHOT, która zawiera także Spring Data Cassandra 1.5.0.M1. Teraz, gdy uruchamiam aplikację i używam funkcji sterownika DataStax, otrzymuję ten sam NoClassDefFoundError, jak poprzednio. Dodawanie Netty jako zależność zabija moje TestRestTemplate testy jednostkowe w oparciu znowu ...

UPDATE: TestRestTemplate nie działa, ponieważ Wiosna Boot konfiguruje go używać Netty4ClientHttpRequestFactory gdy znajdzie się na ścieżce klasy Netty i Netty4ClientHttpRequestFactory nie wydają się działać .

Zobacz https://github.com/spring-projects/spring-boot/issues/7240 i https://jira.spring.io/browse/SPR-14860

Dla poprawki zobacz moją odpowiedź na to pytanie.

+2

Nadchodzący release Wiosna danych Cassandra 1,5 wesprze Cassandra 3.x (patrz https://spring.io/blog/2016/07/27/spring-data-release-train-ingalls-m1-released i https://stackoverflow.com/questions/40020828/missing-artifact-spring-data-cassandra-1-5-0m1). Sterownik Datastax '3.1.1 wymaga Netty 4.0.37.Final. – mp911de

Odpowiedz

4

Pozostaję przy użyciu sterownika Spring Data Cassandra 1.5.0.M1 i Cassandra 3.1.1 stosując następujące przesłonięcia Wersja:

ext['spring.version'] = '5.0.0.M2' 
ext['spring-data-releasetrain.version'] = 'Ingalls-M1' 
ext['cassandra-driver.version'] = '3.1.1' 

Aby Cassandra funkcjonalności kierowca pracę musiałem dodać Netty jako zależność.

compile 'io.netty:netty-all:4.1.6.Final' 

Aby TestRestTemplate.postForObject(...) i TestRestTemplate.put(...) musiałem dostarczyć RestTemplateBuilder@Bean i skonfigurować go do używania SimpleClientHttpRequestFactory.

@TestConfiguration 
static class TestConfig { 
    @Bean 
    public RestTemplateBuilder restTemplateBuilder() { 
     return new RestTemplateBuilder().detectRequestFactory(false).requestFactory(SimpleClientHttpRequestFactory.class); 
    } 
} 
+0

Problem pojawia się także w restTemplate.exchange (...), wciąż w wersji 1.5.1 Spring Spring ... dziękuję za opublikowanie pytania i odpowiedzi. – Hasson