스프링 - 여러 스프링 데이터 모듈이 발견되어 엄격한 저장소 구성 모드로 들어갑니다.
Spring Data, Spring-Data-Elastisearch 및 Spring-data-Redis(http 세션용)와 함께 Spring boot 2를 사용하고 있습니다.앱을 시작할 때.받고 있습니다
2017-10-29 17:38:33.376 INFO 18625 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2017-10-29 17:38:33.451 INFO 18625 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2017-10-29 17:38:33.461 INFO 18625 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2017-10-29 17:38:33.768 INFO 18625 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2017-10-29 17:38:33.783 INFO 18625 --- [ restartedMain] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.ecommerce.core.repository.elastic.ProductElasticSearchRepository.
2017-10-29 17:38:33.787 INFO 18625 --- [ restartedMain] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.ecommerce.core.repository.jpa.UserRepository.
2017-10-29 17:38:33.790 INFO 18625 --- [ restartedMain] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.ecommerce.core.repository.jpa.catalog.CategoryJsonWrapperRepository.
2017-10-29 17:38:33.793 INFO 18625 --- [ restartedMain] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.ecommerce.core.repository.jpa.catalog.CategoryRepository.
2017-10-29 17:38:33.794 INFO 18625 --- [ restartedMain] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.ecommerce.core.repository.jpa.catalog.ProductRepository.
내 App.java 파일에는 다음과 같은 행이 있습니다(모호한 부분은 피해야 합니다).
@EnableJpaRepositories(basePackages = {"com.ecommerce.core.repository.jpa"})
@EnableElasticsearchRepositories(basePackages= {"com.ecommerce.core.repository.elastic"})
@EnableRedisRepositories(basePackages = {"org.springframework.data.redis.connection.jedis"})
매년 봄 데이터 저장소는 직무 인터페이스(주로 JpaRepository 및 ElasticsearchCrudRepository 중 하나)에 따라 확장됩니다.
이 -https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ #substitorys.substories-substories.types를 읽었는데 보시는 바와 같이 모든 것이 문제없이 동작합니다.
답변이 늦어져서 죄송합니다만, 그 답변은 이미 실제적이고 깊은 이유를 설명하지 못하고 있다고 생각합니다.모든 것을 설명해 드리겠습니다(준비해 주세요, 꽤 길고 포괄적입니다).심플한 솔루션을 찾고 있는 경우는, 다음의 회답의 하단을 참조해 주세요.
우선 스프링 데이터는 일반적인 모듈(스프링 데이터 jpa 또는 스프링 데이터 redis와 같은 특정 모듈을 잊음)로서 인터페이스의 계층화를 가지고 있습니다.Repository에서 시작하여 Crud Repository로 넘어갑니다.그 다음 Paging And Sorting Repository가 있습니다.그 차이에 대해서는 자세히 말하지 않겠습니다만, 지금 요점은 아닙니다.중요한 것은 이 인터페이스는 특정 지속성 스토리지와 완전히 분리되어 있다는 것입니다.이는 기술적으로는 특정 스프링 데이터 구현과 함께 즉시 shipping되는 개별 JAR 내에 존재하기 때문입니다(관심 있는 경우 spring-data-commons라고 합니다).
MongoDB에는 스프링 데이터 모듈을 사용할 수 있습니다.스프링 데이터 mongodb를 활용하려면 보통 Crud Repository를 확장하거나 Repository 또는 Mongo Repository를 확장합니다.Spring 데이터의 관점에서 매우 중요합니다.Repository 또는 CrudRepository를 확장하여 자체 인터페이스를 만들고 타깃 저장소 엔티티를 마킹하지 않은 경우(답변 말미에 설명하겠습니다), Spring은 기본적으로 이 마법의 메서드인 FindById,가 얼마나 정확한지 알아내려고 합니다.deleteById와 e.t.c.는 Mongo와 JPA에서 구현이 다르기 때문에 구현해야 합니다.이 점을 염두에 두고 계속 읽어 보십시오.
문제는 스프링이 정확히 어떻게 결정하고 커스텀 인터페이스를 구현해야 하는가 하는 것입니다.Spring buts에는 Repository Factory Bean Support라는 추상화가 있습니다.이것은 커스텀 저장소에서 콩을 만드는 데 실제로 관여하는 것입니다.이제 실험을 해보겠습니다.프로젝트에 스프링 데이터 jdbc 스타터와 스프링 데이터 mongodb 스타터를 모두 추가해 보십시오.Classpath에는 Repository Factory Bean Support의 2가지 다른 구현이 있습니다.
- JdbcRepositoryFactoryBean(스프링 데이터 jdbc 스타터로부터 취득)
- MongoRepositoryFactoryBean (봄 데이터 mongo 스타터에서 제공)
그러면 다음과 같은 실체가 있다고 가정해 보겠습니다.
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Customer {
@Id
private Long id;
@Column("firstname")
private String firstName;
@Column("phone")
private String phone;
}
참고: Id 및 Column 주석은 실제로는 스프링 데이터 주석이지 JPA가 아닙니다.
다음으로 인터페이스(단순한 dao 인터페이스)를 정의합니다.
public interface CustomerCRUDRepository extends CrudRepository<Customer, Long> {
int countByFirstName(String firstName);
}
다음으로 Customer CRUDRepository 유형의 빈을 어딘가에 주입합니다.어플리케이션 부트스트랩을 시도하기만 하면 실패합니다.왜일까요?로그를 함께 조사합니다.
RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
RepositoryConfigurationDelegate : Bootstrapping Spring Data JDBC repositories in DEFAULT mode
RepositoryConfigurationExtensionSupport : Spring Data JDBC - Could not safely identify store assignment for repository candidate interface com.example.springdatajdbc.repositories.CustomerCRUDRepository
질문하신 것과 같은 예외죠?마침내 이것을 분해하자.이제 마지막으로 질문에 대답하겠습니다.
그러면 이 예외가 나타나는 이유는 무엇입니까?
프로젝트 내에 여러 스프링 데이터 모듈이 있는 경우 spring-data-commons 모듈에서 인터페이스를 확장하여 지속성 기술 주석(javax.persistence의 @Entity 또는 mongo의 경우 이름 지정 @Document 등)에 대한 주석을 달지 않는 특정 엔티티티용 인터페이스를 만듭니다.Repository 또는 CrudRepository) - 스프링은 기본적으로 어떤 데이터 스토리지에 할당되어 있는지 모르기 때문에 이 방법은 전혀 작동하지 않습니다.MongoDb인가요? 아니면 JPA인가요?아니면 카산드라는? - 그런 식으로 결정하는 것은 불가능하다, 공식 문서를 참조하라.반면 classpath - spring에 스프링 데이터 모듈이 1개만 있는 경우 모호하지 않기 때문에 저절로 결론을 내릴 수 있습니다.
이 문제를 해결하려면 어떻게 해야 합니까?
Techonogiy 고유의 저장소를 확장합니다.예를 들어 엔티티 A를 Postgre와 할당하는 경우SQL은 CrudRepository를 사용하지 마십시오.JpaRepository를 사용합니다.엔티티 B를 Redis와 관련지으려면 RedisRepository 등을 사용합니다.
특정 데이터 저장소와의 관련성을 나타내는 주석을 사용하여 엔티티에 주석을 추가합니다.@Entity, @Document, @Table 등.
이제 분명해졌으면 좋겠어요.저는 당신에게 설명하려고 정말 노력했어요.읽어주셔서 감사합니다, 좋은 하루 되세요!
특정 패키지에서 리포지토리를 명시적으로 사용하도록 설정하는 경우.이러한 오류를 피하기 위해 application.properties에 포함할 수 있습니다.
spring.data.redis.repositories.enabled=false
다른 저장소에도 동일한 작업을 수행할 수 있습니다.같은 에러가 발생했을 경우:
spring.data.elasticsearch.repositories.enabled=false
spring.data.jpa.repositories.enabled=false
참고 자료: https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
설정은 문제 없습니다.이 문제의 원인은 다음과 같습니다.RedisRepositoriesAutoConfiguration
등록됩니다.EnableRedisRepositories
디폴트 컨피규레이션만을 반복하여 실행한다.basePackages
.
이 문제를 해결하려면 , 다음을 제외할 수 있습니다.RedisRepositoriesAutoConfiguration
기준:
@SpringBootApplication(
exclude = { RedisRepositoriesAutoConfiguration.class }
)
public class MySpringBootApp {
}
프로젝트 중 하나에서 다음과 같은 메시지가 있었습니다.
Spring Data LDAP - Could not safely identify store assignment for repository candidate interface com.company.xxx.EncryptionKeyRepository.
해결책은 이 행을 application.properties 파일에 추가하는 것입니다.
spring.data.ldap.repositories.enabled=false
Spring Data LDAP용입니다.다른 Spring Data 컴포넌트도 비슷할 것 같습니다.
아마 너무 늦었겠지만 어쨌든.스프링 데이터 모듈의 구성 방법을 이해하는 데 도움이 되는 정보 메시지일 뿐입니다.예를 들어 다음과 같습니다.
INFO 87518 --- [main] .RepositoryConfigurationExtensionSupport :
Spring Data JPA - Could not safely identify store assignment for repository
candidate interface com.some.package.MyRepository.
Spring Data JPA 모듈이 MyRepository 클래스를 건너뛰고 사용하지 않음을 의미합니다.
이것은 나에게 매력적으로 작용했다. 나는 2개의 Datasources Mysql과 MongoDb를 사용하고 있다.
@EnableJpaRepository(basePackages = "com.institory").MysqlRepository") @EnableMongoRepository(basePackages = "com.institory").Mongo Repository" (Mongo Repository)
제 경우 Redis를 사용하고 있기 때문에 특정 저장소를 구별하기 위해 엔티티 클래스에 @RedisHash를 추가합니다.
언급URL : https://stackoverflow.com/questions/47002094/spring-multiple-spring-data-modules-found-entering-strict-repository-configur
'programing' 카테고리의 다른 글
액션 컨트롤러:알 수 없는 형식 (0) | 2023.03.21 |
---|---|
스프링 부트 Mongo Repository 유닛 테스트 방법 (0) | 2023.03.21 |
Amazon Cloudfront 비용을 절감하는 방법 (0) | 2023.03.21 |
고급 사용자 지정 필드를 표시하는 JSON API - WordPress (0) | 2023.03.21 |
최신 Spring Boot + Data JPA 및 휴지 상태 설정을 사용하여 ddl 작성 스크립트를 생성하는 방법 (0) | 2023.03.21 |