mkyong - ¿Cómo se usan los repositorios Spring Data JPA y Spring Data Elasticsearch en la misma clase de dominio en una aplicación Spring Boot?
spring-boot-starter-data-elasticsearch (2)
Intento utilizar Spring Data JPA y Spring Data Elasticsearch en el mismo objeto de dominio, pero no funciona.
Cuando traté de ejecutar una prueba simple, obtuve la siguiente excepción:
org.springframework.data.mapping.PropertyReferenceException: ¡No se ha encontrado ningún índice de propiedad para el tipo Person! en org.springframework.data.mapping.PropertyPath. (PropertyPath.java:75) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.mapping.PropertyPath.create (PropertyPath .java: 327) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.mapping.PropertyPath.create (PropertyPath.java:307) ~ [spring-data-commons- 1.11.0.RELEASE.jar: na] en 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] en org.springframework.data.repository.query.parser.Part. ( Part.java:76) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.repository.query.parser.PartTree $ OrPart. (PartTree.java:235) ~ [ spring-data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.repository.query.parser.PartTree $ Predicate.buildTree (PartTree.java:373) ~ [spring-data-commons-1.11 .0.RELEASE.jar: na] en org.springframework.data.repository.query.parser.PartTree $ Predicate. (PartTree.java:353) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] at org.springframework.data .repository.query.parser.PartTree. (PartTree.java:84) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.jpa.repository.query.PartTreeJpaQuery. ( PartTreeJpaQuery.java:61) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] en org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:95) ~ [spring-data-jpa-1.9.0.RELEASE.jar: na] en org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateIfNotFoundQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:206) ~ [spring-data-jpa- 1.9.0.RELEASE.jar: na] en org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ AbstractQueryLookupStrategy.resolveQuery (JpaQueryLookupStrategy.java:73) ~ [spring-data-jpa-1.9.0.RELEASE.jar : na] en org.springframework.data.repository.c ore.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor. (RepositoryFactorySupport.java:408) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository ( RepositoryFactorySupport.java:206) ~ [spring-data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn (RepositoryFactoryBeanSupport.java:251) ~ [spring -data-commons-1.11.0.RELEASE.jar: na] en org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet (RepositoryFactoryBeanSupport.java:237) ~ [spring-data-commons-1.11.0. RELEASE.jar: na] en 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) ~ [sp ring-beans-4.2.1.RELEASE.jar: 4.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1574) ~ [spring-beans-4.2.1.RELEASE .jar: 4.2.1.RELEASE] ... 43 marcos comunes omitidos
Funcionan al deshabilitar cualquiera de los dos.
El proyecto se basa en Spring Boot 1.3.0.M5.
Este es un proyecto de muestra que reproduce la situación:
https://github.com/izeye/spring-boot-throwaway-branches/tree/data-jpa-and-elasticsearch
Puedes usar así:
@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 en 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 {
...
}
Los repositorios en Spring Data son JpaRepository
la JpaRepository
datos, lo que significa que JpaRepository
y JpaRepository
a la interfaz del Repository
. Cuando este es el caso, la configuración automática de Spring Boot hará que Spring Data JPA intente y configure un bean para cada repositorio en el proyecto que hereda cualquier repositorio base de Spring Data Commons.
Para solucionar este problema, debe mover su repositorio JPA y su repositorio Elasticsearch a paquetes separados y asegúrese de anotar su clase de aplicación @SpringBootApplication
con:
-
@EnableJpaRepositories
-
@EnableElasticsearchRepositories
Luego debe especificar dónde están los repositorios para cada anotación de habilitación. Esto termina pareciendo así:
@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);
}
}
Entonces su aplicación podrá eliminar la ambigüedad de los repositorios destinados para el proyecto de Spring Data.