8

Próbuję użyć zarówno Spring Data JPA, jak i Spring Data Elasticsearch na tym samym obiekcie domeny, ale to nie działa.W jaki sposób używasz repozytoriów Spring Data JPA i Spring Data Elasticsearch w tej samej klasie domeny w aplikacji Spring Boot?

Kiedy próbowałem uruchomić prosty test, mam następujący wyjątek:

org.springframework.data.mapping.PropertyReferenceException: Bez indeksu własności znalezionych dla typu osoby! pod adresem org.springframework.data.mapping.PropertyPath. (PropertyPath.java:75) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework.data.mapping.PropertyPath. create (PropertyPath.java:327) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework.data.mapping.PropertyPath.create (PropertyPath.java:307) ~ [ spring-data-commons-1.11.0.RELEASE.jar: na] o 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. Repozytorium danych. query.parser.Part. (Part.java:76) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework.data.repository.query.parser.PartTree $ OrPart. (PartTree.java:235) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework.data.repository.query.parser.PartTree $ Predicate.buildTree (PartTree.java: 373) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] o org.springframework.data.repository.query.parser.PartTree $ Predicate. (PartTree.java:353) ~ [wiosna -data-commons-1.11.0.RELEASE.jar: na] o org.springframework.data.repository.query.parser.PartTree. (PartTree.java:84) ~ [Spring-data-commons-1.11.0 .RELEASE.jar: na] o org.springframework.data.jpa.repository.query.PartTreeJpaQue ry. (PartTreeJpaQuery.java:61) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy. Java: 95) ~ [sprężyny danych JPA-1.9.0.RELEASE.jar: na] w org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateIfNotFoundQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:206) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ AbstractQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:73) ~ [dane źródłowe -jpa-1.9.0.RELEASE.jar: na] o 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] o org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn (RepositoryFactoryBeanSupport.java:251) ~ [Spring-data-commons -1.11.0.RELEASE.jar: na] o org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet (RepositoryFactoryBeanSupport.java:237) ~ [spring-data-commons-1.11.0.RELEASE. jar: na] at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet (JpaRepositoryFactoryBean.java:92) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1637) ~ [sprężyste ziarnach-4.2.1.RELEASE.jar: 4.2.1.RELEASE] w org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java : 1574) ~ [wiosna-fasola-4.2.1.RELEASE.jar: 4.2.1.RELEASE] ... 43 wspólne ramy pominięte

pracują po wyłączeniu jedn.

Projekt oparty jest na Spring Boot 1.3.0.M5.

Jest to przykładowy projekt odtworzenia sytuacji:

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

Odpowiedz

14

Repozytoria w Spring dane są źródła danych agnostykiem, co oznacza, że ​​JpaRepository i ElasticsearchRepository zarówno rolka się do Repository interfejsu. W takim przypadku automatyczna konfiguracja Spring Boot spowoduje, że Spring Data JPA spróbuje skonfigurować komponent bean dla każdego repozytorium w projekcie, który dziedziczy jakiekolwiek repozytorium baz danych Spring Commons.

Aby rozwiązać ten problem, trzeba przenieść repozytorium WZP i Elasticsearch repozytorium aby rozdzielić pakiety i upewnij się, że opisywanie swoją klasę @SpringBootApplication aplikacji z:

  • @EnableJpaRepositories
  • @EnableElasticsearchRepositories

Następnie musisz określić, gdzie znajdują się repozytoriom dla każdej włączonej adnotacji. To kończy się wyglądać tak:

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

} 

Następnie aplikacja będzie w stanie rozróżnić, które repozytoria są przeznaczone dla projektu Spring Data.

+1

Dzięki za szczegóły. Dało mi to wskazówkę do ostatecznego rozwiązania, które wybrałem. Dla mnie użycie 'includeFilters' jest lepsze niż przeniesienie ich do innych pakietów. Źródło danych Spring-Agnostic jest bardzo miłe, ale byłoby miło, gdyby Spring Data JPA nie skanowało, jeśli to możliwe, interfejsów 'ElasticsearchRepository'. –

+2

Dla kogoś, kto interesuje się tym, co zrobiłem, zobacz https://github.com/izeye/spring-boot-throwaway-branches/commit/874ccba09189d6ef897bc430c43b6e3705404399 –

+0

Dzięki kenny-bastani i johnny-lim, głosowałem na was obu –

4

można używać tak:

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

albo w 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

To powinno być w '@ EnableJpaRepositories' powinniśmy używać' JpaRepository.class' right nie 'ElasticsearchCrudRepository.class' ??? – edwin

+0

Ponieważ używam exlude w '@ EnableJpaRepositories', czyli. w Repozytorium Jpa możesz używać nie tylko 'JpaRepository.class' –

+0

OKK, dziękuję ci. – edwin

Powiązane problemy