8

Я пытаюсь использовать как Spring Data JPA, так и Spring Data Elasticsearch на том же объекте домена, но он не работает.Как вы используете как Spring Data JPA, так и Spring Data Elasticsearch репозитории в том же классе домена в приложении Spring Boot?

Когда я попытался запустить простой тест, я получил следующее исключение:

org.springframework.data.mapping.PropertyReferenceException: Нет индекс свойства найдено для типа лица! на org.springframework.data.mapping.PropertyPath. (PropertyPath.java:75) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] в org.springframework.data.mapping.PropertyPath. create (PropertyPath.java:327) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] в org.springframework.data.mapping.PropertyPath.create (PropertyPath.java:307) ~ [ spring-data-commons-1.11.0.RELEASE.jar: na] в org.springframework.data.mapping.PropertyPath.from (PropertyPath.java:270) ~ [spring-data-commons-1.11.0.RELEASE .jar: na] at org.springframework.data.mapping.PropertyPath.from (PropertyPath.java:241) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework. data.repository. query.parser.Part. (Part.java:76) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] в org.springframework.data.repository.query.parser.PartTree $ OrPart. (PartTree.java:235) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] в org.springframework.data.repository.query.parser.PartTree $ Predicate.buildTree (PartTree.java: 373) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework.data.repository.query.parser.PartTree $ Predicate. (PartTree.java:353) ~ [spring -data-commons-1.11.0.RELEASE.jar: na] в org.springframework.data.repository.query.parser.PartTree. (PartTree.java:84) ~ [spring-data-commons-1.11.0 .RELEASE.jar: na] в org.springframework.data.jpa.repository.query.PartTreeJpaQue ry. (PartTreeJpaQuery.java:61) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy. Java: 95) ~ [весенне-данных JPA-1.9.0.RELEASE.jar: на] на org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateIfNotFoundQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:206) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ AbstractQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:73) ~ [spring-data -jpa-1.9.0.RELEASE.jar: na] в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor. (Rep ositoryFactorySupport.java:408) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository (RepositoryFactorySupport.java:206) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] в org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn (RepositoryFactoryBeanSupport.java:251) ~ [spring-data-commons -1.11.0.RELEASE.jar: na] в org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet (RepositoryFactoryBeanSupport.java:237) ~ [spring-data-commons-1.11.0.RELEASE. jar: na] в org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet (JpaRepositoryFactoryBean.java:92) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1637) ~ [весна-бобы-4.2.1.RELEASE.jar: 4.2.1.RELEASE] на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java : 1574) ~ [весна-бобы-4.2.1.RELEASE.jar: 4.2.1.RELEASE] ... 43 общие рамки опущена

Они работают при отключении любой из них.

Проект основан на Spring Boot 1.3.0.M5.

Это образец проект воспроизводя ситуацию:

https://github.com/izeye/spring-boot-throwaway-branches/tree/data-jpa-and-elasticsearch

ответ

14

Хранилище в Spring данных являются источником данных агностика, а это означает, что JpaRepository и ElasticsearchRepository как свернуть в Repository интерфейс. В этом случае автоматическая настройка Spring Boot заставит Spring Data JPA попробовать и настроить компонент для каждого репозитория в проекте, который наследует любой базовый репозиторий Spring Commons.

Чтобы устранить эту проблему, вам нужно переместить хранилище JPA и Elasticsearch хранилище для разделения пакетов и убедитесь, аннотировать класс @SpringBootApplication приложений с:

  • @EnableJpaRepositories
  • @EnableElasticsearchRepositories

Тогда вам нужно указать, где расположены репозитории для каждой аннотации включения. Это заканчивает тем, как:

@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.

+1

Спасибо за подробности. Это дало мне намек на окончательное решение, которое я выбрал. Для меня использование 'includeFilters' лучше, чем перенос их в другие пакеты. Весна-источник данных-агностик-характер очень хорош, но было бы неплохо, если Spring Data JPA, если это возможно, не сканировала интерфейсы «ElasticsearchRepository». –

+2

Для кого-то, кто интересуется тем, что я сделал, см. Https://github.com/izeye/spring-boot-throwaway-branches/commit/874ccba09189d6ef897bc430c43b6e3705404399 –

+0

Спасибо, kenny-bastani и johnny-lim, я голосовал за вас обоих –

4

Вы можете использовать так:

@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 { 
    ... 
} 
+0

Он должен быть в '@ EnableJpaRepositories', мы должны использовать' JpaRepository.class' право не 'ElasticsearchCrudRepository.class' ??? – edwin

+0

Потому что я использую исключение в '@ EnableJpaRepositories', так что. в Jpa Repository вы можете использовать не только 'JpaRepository.class' –

+0

OKK, я поблагодарил вас. – edwin

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

  • Нет связанных вопросов^_^