Java 如何为多个核心和存储库使用Spring Data Solr实现自定义Solr存储库
我想使用SpringDataSolr在一个服务中访问多个/2个repo。 据我所知,“不幸的是,通过名称空间配置支持多核是一个开放的问题” 你能帮我举个例子吗?我怎样才能创建自定义回购协议 My applicationContext.xml有两个定义如下的Solr模板:Java 如何为多个核心和存储库使用Spring Data Solr实现自定义Solr存储库,java,spring,solr,solrj,spring-data-solr,Java,Spring,Solr,Solrj,Spring Data Solr,我想使用SpringDataSolr在一个服务中访问多个/2个repo。 据我所知,“不幸的是,通过名称空间配置支持多核是一个开放的问题” 你能帮我举个例子吗?我怎样才能创建自定义回购协议 My applicationContext.xml有两个定义如下的Solr模板: <!-- Enable Solr repositories and configure repository base package --> <solr:repositories base-package="
<!-- 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>
有人能告诉我如何修改代码以实现中提到的自定义存储库吗?因为我无法理解此线程中建议的解决方案
非常感谢。存储库扫描将查找
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);
}
}
当我按照答案中的建议这样做时,我得到了PersistenceExceptionTranslator异常,所以我手动初始化这个bean:
<beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>
Hi@Itai-Peleg,它对我有效,无需手动初始化这个额外的bean。像往常一样,它是一个完美的解决方案。非常感谢您的快速回复。Cheers@Christoph-根据Spring的说法,Strobl,发布的答案显然不再有效。没有这种自动配置功能,您的解决方案是如何工作的?我们真的需要找到一种方法来使用多个solr实例,但只遇到了问题。这在最新的spring数据solr上不起作用。类已被删除(例如SolrServerFactory)。任何解决方案?只需使用相应的SolrClientFactory
。嗨,使用最新的spring数据,这不起作用。存储库从实体获取核心。这会导致一个错误,因为它试图从位于的服务器上执行select on错误http://localhost:8983/solr/events/events/select […]错误404未找到
模板工作正常。现在可以按照此处的说明设置具有多个存储库的多个内核
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);
}
}
@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()));
}
}
<beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>