2016-10-25 24 views
6

Tôi muốn sử dụng Cassandra 3.x trong dự án Khởi động mùa xuân. Tôi phát hiện ra rằng phiên bản phát hành hiện tại của dự án Spring Data Cassandra chỉ hỗ trợ Cassandra 2.x. Vì vậy, tôi muốn sử dụng DataStax Driver thay vì dự án Spring Data Cassandra. Tôi đã thêmKhởi động mùa xuân 1.4.1 và Cassandra 3.x

compile 'com.datastax.cassandra:cassandra-driver-core:3.1.1' 

làm phụ thuộc. Bây giờ tôi có thể chèn các giá trị vào một keyspace trên một cụm Cassandra. Nhưng khi chạy thử nghiệm cho một bộ điều khiển phần còn lại tôi nhận được một lỗi

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

Vì vậy, tôi đã thêm

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

như một sự phụ thuộc và các lỗi đi. Nhưng bây giờ tất cả các bài kiểm tra sử dụng

TestRestTemplate.postForObject(...) 

hoặc

TestRestTemplate.put(...) 

thất bại. Nhưng sử dụng

TestRestTemplate.getForObject(...) 

hoạt động như mong đợi. Tôi cho rằng có một số xung đột trong các phụ thuộc của Spring Boot và phiên bản Netty mà tôi đã thêm vào dưới dạng phụ thuộc.

Tôi phát hiện ra phiên bản mới nhất của trình điều khiển Cassandra DataStax hoạt động mà không có sự phụ thuộc Netty bổ sung là 2.1.5, ngày tháng 3 năm 2015 và không hỗ trợ Cassandra 3. Sử dụng trình điều khiển này mọi thứ hoạt động nhưng tôi không muốn sử dụng một trình điều khiển cũ.

CẬP NHẬT: Tôi đã xóa phụ thuộc trình điều khiển DataStax và cố sử dụng phiên bản 1.5.0.M1 của Spring Data Cassandra và khắc phục các phiên bản trình điều khiển Spring, Spring Data Cassandra và Cassandra trong bản dựng.

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

Điều này dẫn đến các lỗi sau:

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

khi sử dụng chức năng Cassandra. Khi tôi bao gồm Netty một lần nữa, chức năng Cassandra hoạt động nhưng các thử nghiệm của tôi sử dụng TestRestTemplate.put.post không hoạt động nữa. Tôi đã thử một lần nữa để nâng cấp lên Spring Boot Version 2.0.0.BUILD-SNAPSHOT cũng bao gồm Spring Data Cassandra 1.5.0.M1. Bây giờ khi tôi khởi động ứng dụng và sử dụng chức năng DataStax Driver, tôi nhận được cùng NoClassDefFoundError như trước đây. Thêm Netty như một sự phụ thuộc giết TestRestTemplate kiểm tra đơn vị có trụ sở của tôi một lần nữa ...

UPDATE: TestRestTemplate không được làm việc bởi vì mùa xuân Boot cấu hình nó để sử dụng Netty4ClientHttpRequestFactory khi nó tìm thấy Netty trên classpath và Netty4ClientHttpRequestFactory dường như không làm việc .

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

Đối với một sửa chữa xem câu trả lời của tôi cho câu hỏi này.

+2

Việc phát hành sắp tới mùa xuân dữ liệu Cassandra 1.5 sẽ hỗ trợ Cassandra 3.x (xem https://spring.io/blog/2016/07/27/spring-data-release-train-ingalls-m1-released và https://stackoverflow.com/questions/40020828/missing-artifact-spring-data-cassandra-1-5-0m1). Trình điều khiển Datastax '3.1.1 yêu cầu netty 4.0.37.Final. – mp911de

Trả lời

4

Tôi muốn sử dụng Spring Data Cassandra 1.5.0.M1 và trình điều khiển Cassandra 3.1.1 sử dụng ghi đè phiên bản sau:

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

Để làm cho chức năng điều khiển Cassandra hoạt động, tôi phải thêm Netty làm phụ thuộc.

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

Để làm TestRestTemplate.postForObject(...)TestRestTemplate.put(...) tôi phải cung cấp một RestTemplateBuilder@Bean và cấu hình nó để sử dụng SimpleClientHttpRequestFactory.

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

Sự cố cũng xuất hiện trong restTemplate.exchange (...), vẫn còn trong phiên bản khởi động mùa xuân 1.5.1 ... cảm ơn bạn đã đăng câu hỏi và câu trả lời. – Hasson

Các vấn đề liên quan