1

Я пытаюсь создать простой прототип с использованием Spring Boot и Spring Data Couchbase. До сих пор я был заглушен, пытаясь использовать механизм генерации запросов Spring-Data для построения запроса N1QL из имени метода.Spring Boot and Spring Data Couchbase N1QL автогенерированный запрос

Это то, что у меня есть для определения интерфейса моего репозитория, и проблема заключается в строке findBy ....

public interface MetricsRepository extends CrudRepository<Single, String> { 
    Single save(Single entity); 
    Single findOne(String id); 
    List<Single> findByServiceID(long serviceId); 
} 

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

Caused by: java.lang.AbstractMethodError: org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactory$CouchbaseQueryLookupStrategy.resolveQuery(Ljava/lang/reflect/Method;Lorg/springframework/data/repository/core/RepositoryMetadata;Lorg/springframework/data/repository/core/NamedQueries;)Lorg/springframework/data/repository/query/RepositoryQuery; 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:416) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:206) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:251) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:237) 
    at org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactoryBean.afterPropertiesSet(CouchbaseRepositoryFactoryBean.java:96) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    ... 36 more 

Если я указать @Query (например: @Query ("# {# n1ql.selectEntity} WHERE роль = . $ 1") я получаю ту же ошибку

Мое определение сущность:.

import com.couchbase.client.java.repository.annotation.Id; 
import com.couchbase.client.java.repository.annotation.Field; 
import org.springframework.data.couchbase.core.mapping.Document; 

@Document 
public class Single { 
    @Id private final String eventID; 
    @Field private final long serviceID; 
    @Field private final long metric; 
    @Field private final long timestamp; 
    @Field private final long previous; 

    public Single(String eventID, long serviceID, long metric, long timestamp, long previous) { 
     this.eventID = eventID; 
     this.serviceID = serviceID; 
     this.metric = metric; 
     this.timestamp = timestamp; 
     this.previous = previous; 
    } 

    public String getEventID() { return eventID; } 
    public long getServiceID() { return serviceID; } 
    public long getMetric() { return metric; } 
    public long getTimestamp() { return timestamp; } 
    public long getPrevious() { return previous; } 
} 

Я использую репозиторий через @Autowired аннотацию в контроллере REST у меня есть @Configuration и @EnableCouchbaseRepositories класс конфигурации @ Import-ed в @SpringBootApplication. У меня есть Cou версия сообщества chbase Server 4.0.0, установленная в моем тестовом экземпляре, и если запрос n1ql не существует, я могу подключать и сохранять и извлекать объекты.

Мои зависимости в Gradle:

dependencies { 
    compile("org.springframework.data:spring-data-couchbase:2.1.1.RELEASE") 
    compile("org.springframework.boot:spring-boot-starter-web") 
    compile("org.springframework.boot:spring-boot-starter-actuator") 
    testCompile("org.springframework.boot:spring-boot-starter-test") 
    testCompile("junit:junit") 
} 
+0

'AbstractMethodError' означает, что у вас есть несовместимые банки на пути к классам. Почему вы заставляете версию «data-couchbase»? Какую версию загрузки вы используете? –

+0

Я заставляю версию couchbase, потому что это последняя версия релиза, и это то, как зависимость была указана на странице быстрого запуска проекта data-couchbase. Весенняя версия загрузки - 1.3.3.RELEASE – davdic

ответ

1

Так что я сделал немного детективной зависимость работы:

  • Spring ботинке 1.3.3 относится к Spring Data BOM в версии 1.7.4 (Gosling SR4)
  • Эта версия Spring Data BOM приносит spring data-couchbase 1.4.4 , Это то, что вы получите, если не заставите версию, как вы.
  • Но что корень вашей проблемы является то, что он также приносит в spring-data-commons 1.11.4 (конечно, как BOM сделано связать согласованный набор версий)

Таким образом, вы в конечном итоге вынудив версию просто Spring Data Couchbase, в то же время полагаясь на спецификацию для выбора Spring Commons, что приводит к несовместимым артефактам.

Вот несколько плохих новостей: если вы хотите Spring Data Couchbase 2.x (новое поколение), оно официально поддерживается только в Spring Data Hopper. И Hopper только официально поддерживается в Spring Boot 1.4.0, который ** в настоящее время в MILESTONE 2.

Если вы хотите, чтобы начать играть с Spring Data Couchbase 2.x, возможно, с использованием Spring загрузки 1.4.0.M2 является приемлемым?

Если вам не нужна версия 2.x, вы должны просто удалить версию в конфигурации Gradle, и она должна работать.

DANGER ZONE: Если вы абсолютно хотите сделать некоторый Spring Data Couchbase 2.1.1 внутри Spring ботинке 1.3.3, то обратите внимание, что нибудь может сломаться, если через столкновение с зависимостями. Тем не менее, если вы используете только хранилище данных Couchbase, возможно, с вами все будет в порядке. Способ сделать это сложнее с Gradle, поскольку вам нужен плагин для импорта спецификации. Посмотрите на this gist.

Я обновил сайт проекта, чтобы отметить, что спецификацию, как правило, предпочитают форсировать версию. Быстрый запуск для автономных проектов.

0

У меня была такая же проблема (java.lang.AbstractMethodError) с Spring Data Couchbase 2.1.1. Но в этом случае я использовал другие зависимости в проекте, используя другую требуемую версию Spring Commons, и они были в конфликте. Попробуйте использовать другую версию, возможно, 2.1.0.

Смежные вопросы