Как вы используете репозитории Spring Data JPA и Spring Data Elasticsearch в одном классе домена в приложении Spring Boot?
Я пытаюсь использовать как Spring Data JPA, так и Spring Data Elasticsearch на одном объекте домена, но это не работает.
когда я попытался запустить простой тест, я получаю следующее исключение:
org.springframework.данные.отображение.PropertyReferenceException: Нет индекс недвижимости найден для типа Person! на орг.springframework.данные.отображение.PropertyPath.(PropertyPath.на Java:75) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.отображение.PropertyPath.create (PropertyPath.java: 327) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.отображение.PropertyPath.create (PropertyPath.java: 307) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.отображение.PropertyPath.из(PropertyPath.java: 270) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.отображение.PropertyPath.из(PropertyPath.java: 241) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.запрос.синтаксический анализатор.Часть.(Часть.Ява:76) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.запрос.синтаксический анализатор.PartTree$OrPart.(PartTree.java: 235) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.запрос.синтаксический анализатор.Предикат PartTree$.buildTree (PartTree.java: 373) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.запрос.синтаксический анализатор.Предикат PartTree$.(PartTree.java: 353) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.запрос.синтаксический анализатор.Парттри.(PartTree.java: 84) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.jpa.хранилище.запрос.PartTreeJpaQuery.(PartTreeJpaQuery.Ява:61) ~[spring-data-jpa-1.9.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.jpa.хранилище.запрос.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java: 95) ~[spring-data-jpa-1.9.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.jpa.хранилище.запрос.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java: 206) ~[spring-data-jpa-1.9.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.jpa.хранилище.запрос.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java: 73) ~[spring-data-jpa-1.9.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.ядро.поддержка.RepositoryFactorySupport$QueryExecutorMethodInterceptor.(RepositoryFactorySupport.java: 408) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.ядро.поддержка.RepositoryFactorySupport.getRepository (RepositoryFactorySupport.java: 206) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.ядро.поддержка.RepositoryFactoryBeanSupport.initAndReturn (RepositoryFactoryBeanSupport.java: 251) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.хранилище.ядро.поддержка.RepositoryFactoryBeanSupport.afterPropertiesSet (RepositoryFactoryBeanSupport.java: 237) ~[spring-data-commons-1.11.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.данные.jpa.хранилище.поддержка.JpaRepositoryFactoryBean.afterPropertiesSet (JpaRepositoryFactoryBean.java: 92) ~[spring-data-jpa-1.9.0.ОСВОБОЖДАТЬ.jar: na] at орг.springframework.зернышки.фабрика.поддержка.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java: 1637) ~[весна-бобы-4.2.1.ОСВОБОЖДАТЬ.jar: 4.2.1.RELEASE] at орг.springframework.зернышки.фабрика.поддержка.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java: 1574) ~[весна-бобы-4.2.1.ОСВОБОЖДАТЬ.jar: 4.2.1.Выпуск] ... 43 общие кадры опущено
Они работают при отключении любого из них.
проект основан на Spring Boot 1.3.0.М5.
Это образец проекта, воспроизводящий ситуация:
https://github.com/izeye/spring-boot-throwaway-branches/tree/data-jpa-and-elasticsearch
2 ответов
хранилища весной данные источник данных агностик, то JpaRepository
и ElasticsearchRepository
оба свертываются в Repository
интерфейс. В этом случае автоматическая настройка Spring Boot приведет к тому, что Spring Data JPA попытается настроить компонент для каждого репозитория в проекте, который наследует любой репозиторий Spring Data Commons base.
чтобы устранить эту проблему, вам нужно переместить репозиторий JPA и репозиторий Elasticsearch в отдельные пакеты и обязательно аннотировать @SpringBootApplication
класс применения с:
@EnableJpaRepositories
@EnableElasticsearchRepositories
затем вам нужно указать, где находятся репозитории для каждой аннотации enable. Это в конечном итоге выглядит так:
@SpringBootApplication
@EnableJpaRepositories("com.izeye.throwaway.data")
@EnableElasticsearchRepositories("com.izeye.throwaway.indexing")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
тогда ваше приложение сможет разобраться, какие репозитории предназначены для какого проекта Spring Data.
Вы можете использовать такой:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ElasticsearchCrudRepository.class))
@EnableElasticsearchRepositories(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ElasticsearchCrudRepository.class))
public class DataConfiguration {
...
}
или в SpringBoot:
@SpringBootApplication
@EnableJpaRepositories(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ElasticsearchCrudRepository.class))
@EnableElasticsearchRepositories(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ElasticsearchCrudRepository.class))
public class MyApplication {
...
}