8

Ich versuche, Spring Data JPA und Spring Data Elasticsearch für das gleiche Domänenobjekt zu verwenden, aber es funktioniert nicht. Wie verwenden Sie Spring Data JPA- und Spring Data Elasticsearch-Repositories für dieselbe Domä- nenklasse in einer Spring Boot-Anwendung?

Als ich versuchte, einen einfachen Test zu laufen, habe ich die folgende Ausnahme:

org.springframework.data.mapping.PropertyReferenceException: Nein Immobilienindex für Typ Person gefunden! unter org.springframework.data.mapping.PropertyPath. (PropertyPath.java:75) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] um org.springframework.data.mapping.PropertyPath. create (PropertyPath.java:327) ~ [frühjahr-daten-commons-1.11.0.RELEASE.jar: na] um org.springframework.data.mapping.PropertyPath.create (PropertyPath.java307) ~ [ spring-data-commons-1.11.0.RELEASE.jar: na] unter org.springframework.data.mapping.PropertyPath.from (PropertyPath.java:270) ~ [spring-data-commons-1.11.0.RELEASE .jar: na] unter org.springframework.data.mapping.PropertyPath.from (PropertyPath.java:241) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] unter org.springframework. Datenablage. query.parser.Part. (Part.java:76) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] unter org.springframework.data.repository.query.parser.PartTree $ OrPart. (PartTree.java:235) ~ [frühjahr-daten-commons-1.11.0.RELEASE.jar: na] um org.springframework.data.repository.query.parser.PartTree $ Prädikat.buildTree (PartTree.java: 373) ~ [frühjahr-daten-commons-1.11.0.RELEASE.jar: na] um org.springframework.data.repository.query.parser.PartTree $ Prädikat. (PartTree.java:353) ~ [Frühling -data-commons-1.11.0.RELEASE.jar: na] unter org.springframework.data.repository.query.parser.PartTree. (PartTree.java:84) ~ [spring-data-commons-1.11.0 .RELEASE.jar: na] unter org.springframework.data.jpa.repository.query.PartTreeJpaQue ry. (PartTreeJpaQuery.java:61) ~ [Spring-Daten-jpa-1.9.0.RELEASE.jar: na] um org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy. java: 95) ~ [Feder-data-JPA-1.9.0.RELEASE.jar: na] bei org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateIfNotFoundQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:206) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] um org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ AbstractQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:73) ~ [spring-data -jpa-1.9.0.RELEASE.jar: na] um org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor. (Rep ositoryFactorySupport.java:408) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] um org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository (RepositoryFactorySupport.java:206) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] unter org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn (RepositoryFactoryBeanSupport.java:251) ~ [spring-data-commons -1.11.0.RELEASE.jar: na] unter org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet (RepositoryFactoryBeanSupport.java:237) ~ [spring-data-commons-1.11.0.RELEASE. jar: na] um org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet (JpaRepositoryFactoryBean.java:92) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] unter org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1637) ~ [Feder-Bohnen-4.2.1.RELEASE.jar: 4.2.1.RELEASE] bei org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java : 1574) ~ [Feder-Bohnen-4.2.1.RELEASE.jar: 4.2.1.RELEASE] ... 43 gemeinsamer Rahmen weggelassen

Sie arbeiten, wenn entweder deaktivieren.

Das Projekt basiert auf Spring Boot 1.3.0.M5.

Dies ist ein Beispielprojekt die Situation reproduzieren:

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

Antwort

14

Repositorys in Spring Data sind Datenquelle agnostisch, was bedeutet, dass JpaRepository und ElasticsearchRepository beide rollen oben in Repository Schnittstelle. Wenn dies der Fall ist, bewirkt die automatische Konfiguration von Spring Boot, dass Spring Data JPA versucht, eine Bean für jedes Repository im Projekt zu konfigurieren, das ein Spring Data Commons-Basisrepository erbt.

um dieses Problem zu beheben, müssen Sie Ihre JPA-Repository und Elasticsearch Repository verschieben Pakete zu trennen und stellen Sie sicher, dass Ihre @SpringBootApplication Anwendungsklasse mit zu annotieren:

  • @EnableJpaRepositories
  • @EnableElasticsearchRepositories

Dann Sie müssen angeben, wo sich die Repositorys für die einzelnen aktivierten Annotations befinden. Damit endet aussehen wie:

@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); 
    } 

} 

Dann wird Ihre Anwendung in der Lage sein, eindeutig zu machen, welche Repositories für die Spring Data Projekt bestimmt sind.

+1

Dank für die Details. Es gab mir einen Hinweis auf eine endgültige Lösung, die ich wählte. Für mich ist die Verwendung von 'includeFilters' besser, als sie in andere Pakete zu verschieben. Die Datenquellen-agnostische Natur von Spring Data ist sehr schön, aber es wäre schön, wenn Spring Data JPA die 'ElasticsearchRepository'-Schnittstellen nicht nach Möglichkeit scannen würde. –

+2

Für jemanden, der interessiert, was ich getan habe, siehe https://github.com/izey/spring-boot-throwaway-branches/commit/874ccba09189d6ef897bc430c43b6e3705404399 –

+0

Dank Kenny-Bastani und Johnny-lim, ich wählte für Sie beide –

4

können Sie wie folgt verwenden:

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

Oder in 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

Es sollte in '@ EnableJpaRepositories' sollten wir' JpaRepository.class' richtig nicht 'ElasticsearchCrudRepository.class' verwenden ??? – edwin

+0

Weil ich exlude in '@ EnableJpaRepositories' verwende, also. in Jpa Repository können Sie nicht nur 'JpaRepository.class' verwenden –

+0

OKK ich habe dich danke. – edwin