[SPRING] 여러 코어 및 저장소에 Spring Data Solr을 사용하여 사용자 정의 Solr 저장소를 구현하는 방법
SPRING여러 코어 및 저장소에 Spring Data Solr을 사용하여 사용자 정의 Solr 저장소를 구현하는 방법
나는 spring-data-solr을 사용하여 하나의 서비스에서 multiple / 2 repos에 접근 할 수 있기를 원한다. 스프링 데이터 솔라 (Spring Data Solr)의 여러 코어와 저장소에서 네임 스페이스 설정을 통한 멀티 코어 지원은 안타깝게도 아직 공개되지 않은 문제입니다.
다음 예제를 통해 나를 도울 수 있습니까? 어떻게 사용자 정의 Repos를 만들 수 있습니까?
내 applicationContext.xml에는 아래에 정의 된 두 개의 Solr 템플릿이 있습니다.
<!-- Enable Solr repositories and configure repository base package -->
<solr:repositories base-package="com.ay.api.repository"/>
<!-- Configures HTTP Solr server -->
<solr:solr-server id="solrServer" url="${solr.server.url}"/>
<!-- Configures Solr Events template -->
<bean id="solrEventsTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<qualifier type="solrEventsTemplate"/>
<constructor-arg index="0" ref="solrServer"/>
<constructor-arg index="1" value="${solr.server.events.core.name}"/>
</bean>
<!-- Configures Solr Towns template -->
<bean id="solrTownsTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg index="0" ref="solrServer"/>
<constructor-arg index="1" value="${solr.server.towns.core.name}"/>
</bean>
나는 다음과 같은 repos를 가지고있다.
@Repository
public class EventDocumentRepositoryImpl implements EventSearchRepository {
@Resource
@Qualifier("solrEventsTemplate")
private SolrTemplate solrEventsTemplate;
...
}
public interface EventDocumentRepository extends EventSearchRepository, SolrCrudRepository<EventDocument, String> {
}
public interface EventSearchRepository { .... }
@Repository
public class TownRepositoryImpl implements TownSearchRepository { ...
@Resource
@Qualifier("solrTownsTemplate")
private SolrTemplate solrTownsTemplate;
...
}
public interface TownRepository extends SolrCrudRepository<TownDocument, String>{}
public interface TownSearchRepository { .... }
마지막으로 Service는 다음과 같습니다.
@Service
public class SearchEventServiceImpl implements SearchEventService {
@Resource
private EventDocumentRepository eventRepository;
@Resource
private TownRepository townRepository;
.....
}
스프링 데이터 솔라에서 Solr 4.1 멀티 코어를 사용하여 언급 한대로 사용자 정의 리포지토리 구현 코드를 어떻게 수정할 수 있습니까? 나는이 스레드에서 제안 된 해결책을 이해할 수 없기 때문에.
사전에 많은 감사드립니다.
해결법
-
==============================
1.저장소 검색은 solrTemplate을 찾고 제공된 템플리트를 사용하여 저장소를 작성합니다. 각 Solr 코어마다 하나의 템플릿이 필요하므로 템플릿과 저장소를 수동으로 만들어야합니다.
저장소 검색은 solrTemplate을 찾고 제공된 템플리트를 사용하여 저장소를 작성합니다. 각 Solr 코어마다 하나의 템플릿이 필요하므로 템플릿과 저장소를 수동으로 만들어야합니다.
먼저 리포지토리와 사용자 지정 구현을 만듭니다.
public interface EventRepositoryCustom { Page<Event> findEvent(); } public interface EventRepository extends EventRepositoryCustom, SolrCrudRepository<Event, String> { } public class EventRepositoryImpl implements EventRepositoryCustom { private SolrTemplate eventTemplate; public EventRepositoryImpl(SolrTemplate eventTemplate) { this.eventTemplate = eventTemplate; } @Override public Page<Event> findEvent() { return eventTemplate.queryForPage(new SimpleQuery("*:*"), Event.class); } }
TownRepository에도 똑같이하십시오.
구성을 위해 Java Config 사용. 동일한 작업을 XML로 수행 할 수 있습니다.
@Configuration public class SolrContext { private static final String PROPERTY_NAME_SOLR_SERVER_URL = "solr.host"; @Resource private Environment environment; // Factory creates SolrServer instances for base url when requesting server // for specific core. @Bean public SolrServerFactory solrServerFactory() { return new MulticoreSolrServerFactory(new HttpSolrServer( environment.getRequiredProperty(PROPERTY_NAME_SOLR_SERVER_URL))); } // SolrTemplate for /solrServerUrl/towns @Bean public SolrTemplate townTemplate() throws Exception { SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory()); solrTemplate.setSolrCore("towns"); return solrTemplate; } // SolrTemplate for /solrServerUrl/events @Bean public SolrTemplate eventTemplate() throws Exception { SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory()); solrTemplate.setSolrCore("events"); return solrTemplate; } @Bean public EventRepository eventRepository() throws Exception { return new SolrRepositoryFactory(eventTemplate()) .getRepository(EventRepository.class, new EventRepositoryImpl(eventTemplate())); } @Bean public TownRepository townRepository() throws Exception { return new SolrRepositoryFactory(townTemplate()) .getRepository(TownRepository.class, new TownRepositoryImpl(townTemplate())); } }
-
==============================
2.내가 대답을 제안 할 때 PersistenceExceptionTranslator 예외가 발생하여이 bean을 수동으로 초기화합니다.
내가 대답을 제안 할 때 PersistenceExceptionTranslator 예외가 발생하여이 bean을 수동으로 초기화합니다.
<beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>
from https://stackoverflow.com/questions/20872393/how-to-implement-custom-solr-repository-using-spring-data-solr-for-multiple-core by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링을 사용하여 전략 패턴을 효율적으로 구현하는 방법은 무엇입니까? (0) | 2019.04.02 |
---|---|
[SPRING] Hazelcast를 스프링을 사용하는 세션 캐싱에 대해 노드 집합으로 제한하면서 구성하는 방법은 무엇입니까? (0) | 2019.04.02 |
[SPRING] Spring Security가 Tomcat에서 작동하지만 Weblogic에 배포되지 않는 이유는 무엇입니까? (0) | 2019.04.02 |
[SPRING] 봄 보안, Cors 오류 때 Oauth2 사용 (0) | 2019.04.02 |
[SPRING] 전역 변수와 응용 프로그램 변수 Spring 부트 프로젝트에서 정의하기 (0) | 2019.04.02 |