如何使用Spring Data Solr为多个核心和存储库实现自定义Solr存储库

我希望使用spring-data-solr在一个服务中访问多个/ 2个repos。 从Spring Data Solr多核和存储库我知道’通过命名空间配置的多核支持不幸是一个悬而未决的问题’。

能否请您帮我解决以下示例,如何创建自定义Repos?

我的applicationContext.xml有两个Solr模板定义如下:

               

我有以下回购

 @Repository public class EventDocumentRepositoryImpl implements EventSearchRepository { @Resource @Qualifier("solrEventsTemplate") private SolrTemplate solrEventsTemplate; ... } public interface EventDocumentRepository extends EventSearchRepository, SolrCrudRepository { } public interface EventSearchRepository { .... } @Repository public class TownRepositoryImpl implements TownSearchRepository { ... @Resource @Qualifier("solrTownsTemplate") private SolrTemplate solrTownsTemplate; ... } public interface TownRepository extends SolrCrudRepository{} public interface TownSearchRepository { .... } 

最后服务如下:

  @Service public class SearchEventServiceImpl implements SearchEventService { @Resource private EventDocumentRepository eventRepository; @Resource private TownRepository townRepository; ..... } 

有人可以建议如何修改我的代码来实现自定义存储库,如Spring Data Solr与Solr 4.1多核中所述 ? 因为我无法理解这个post中的建议解决方案。

提前谢谢了。

存储库扫描将查找solrTemplate并使用提供的模板创建存储库。 由于每个Solr核心需要一个模板,因此您必须手动创建模板和存储库。

首先创建您的存储库和自定义实现。

 public interface EventRepositoryCustom { Page findEvent(); } public interface EventRepository extends EventRepositoryCustom, SolrCrudRepository { } public class EventRepositoryImpl implements EventRepositoryCustom { private SolrTemplate eventTemplate; public EventRepositoryImpl(SolrTemplate eventTemplate) { this.eventTemplate = eventTemplate; } @Override public Page findEvent() { return eventTemplate.queryForPage(new SimpleQuery("*:*"), Event.class); } } 

TownRepository执行相同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())); } } 

当我在答案中建议这样做时,我得到了PersistenceExceptionTranslatorexception,所以我手动初始化这个bean: