如何使用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: