8

Sto provando a utilizzare sia Spring Data JPA che Spring Data Elasticsearch sullo stesso oggetto dominio ma non funziona.Come si utilizzano i repository Spring Data JPA e Spring Data Elasticsearch sulla stessa classe di dominio in un'applicazione Spring Boot?

Quando ho provato a eseguire un semplice test, ho avuto la seguente eccezione:

org.springframework.data.mapping.PropertyReferenceException: Nessun indice immobili trovati per il tipo di persona! a org.springframework.data.mapping.PropertyPath. (PropertyPath.java:75) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.mapping.PropertyPath. create (PropertyPath.java:327) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.mapping.PropertyPath.create (PropertyPath.java:307) ~ [ spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.mapping.PropertyPath.from (PropertyPath.java:270) ~ [spring-data-commons-1.11.0.RELEASE .jar: na] a org.springframework.data.mapping.PropertyPath.from (PropertyPath.java:241) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework. data.repository. query.parser.Part. (Part.java:76) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.repository.query.parser.PartTree $ OrPart. (PartTree.java:235) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.repository.query.parser.PartTree $ Predicate.buildTree (PartTree.java: 373) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.repository.query.parser.PartTree $ Predicate. (PartTree.java:353) ~ [primavera -data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.repository.query.parser.PartTree. (PartTree.java:84) ~ [spring-data-commons-1.11.0 .RELEASE.jar: na] a org.springframework.data.jpa.repository.query.PartTreeJpaQue ry. (PartTreeJpaQuery.java:61) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] a org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy. java: 95) ~ [primavera-dati-APP-1.9.0.RELEASE.jar: nd] a org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateIfNotFoundQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:206) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] a org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ AbstractQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:73) ~ [spring-data -jpa-1.9.0.RELEASE.jar: na] a org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor. (Rep ositoryFactorySupport.java:408) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository (RepositoryFactorySupport.java:206) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] a org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn (RepositoryFactoryBeanSupport.java:251) ~ [spring-data-commons -1.11.0.RELEASE.jar: na] a org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet (RepositoryFactoryBeanSupport.java:237) ~ [spring-data-commons-1.11.0.RELEASE. jar: na] a org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet (JpaRepositoryFactoryBean.java:92) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] a org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1637) ~ [primavera-fagioli-4.2.1.RELEASE.jar: 4.2.1.RELEASE] a org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java : 1574) ~ [primavera-fagioli-4.2.1.RELEASE.jar: 4.2.1.RELEASE] ... 43 fotogrammi comuni omessi

lavorano quando disabilitando uno dei due.

Il progetto è basato su Spring Boot 1.3.0.M5.

Si tratta di un progetto di esempio che riproduce la situazione:

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

risposta

14

Repositories a dati Primavera sono di origine dati agnostico, il che significa che JpaRepository e ElasticsearchRepository sia roll up in Repository interfaccia. In questo caso, la configurazione automatica di Spring Boot farà in modo che Spring Data JPA provi e configuri un bean per ciascun repository nel progetto che eredita qualsiasi repository di base Spring Data Commons.

Per risolvere questo problema è necessario spostare il repository JPA e repository elasticsearch per separare i pacchetti e assicurarsi di annotare la classe @SpringBootApplication applicazione con:

  • @EnableJpaRepositories
  • @EnableElasticsearchRepositories

Poi è necessario specificare dove sono i repository per ogni annotazione di abilitazione. Questo finisce per assomigliare:

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

} 

Allora la vostra applicazione sarà in grado di disambiguare che i repository sono destinati per il quale progetto Spring Data.

+1

Grazie per i dettagli. Mi ha dato un suggerimento per una soluzione finale che ho scelto. Per me, usare 'includeFilters' è meglio che spostarli in un altro pacchetto. La natura agnostica dell'origine dati di Spring Data è molto bella, ma sarebbe bello che Spring Data JPA non eseguisse la scansione delle interfacce 'ElasticsearchRepository', se possibile. –

+2

Per qualcuno che interessa quello che ho fatto, vedere https://github.com/izeye/spring-boot-throwaway-branches/commit/874ccba09189d6ef897bc430c43b6e3705404399 –

+0

Grazie kenny-bastani e johnny-lim, ho votato per entrambi –

4

È possibile utilizzare in questo modo:

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

O 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

Dovrebbe essere in '@ EnableJpaRepositories' dovremmo usare' JpaRepository.class' giusto non 'ElasticsearchCrudRepository.class' ??? – edwin

+0

Perché uso exlude in '@ EnableJpaRepositories', quindi. nel repository Jpa, puoi usare non solo 'JpaRepository.class' –

+0

OKK, ti ho ringraziato. – edwin