我想使用 spring-data-solr 在一项服务中访问多个/2 个存储库。
从Spring Data Solr 多核和存储库我知道“不幸的是,通过命名空间配置的多核支持是一个悬而未决的问题”。
您能帮我看一下以下示例吗?如何创建自定义存储库?
我的 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>
我有以下回购协议
@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
public class SearchEventServiceImpl implements SearchEventService {
@Resource
private EventDocumentRepository eventRepository;
@Resource
private TownRepository townRepository;
.....
}
有人可以建议我如何修改我的代码以实现自定义存储库,如中提到的Spring Data Solr 与 Solr 4.1 多核?因为我无法理解该线程中建议的解决方案。
提前谢谢了。
存储库扫描将寻找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()));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)