我想使用SpringDataSolr在一个服务中访问多个/2个repo。从SpringDataSolr多核和存储库中,我知道“不幸的是,通过名称空间配置支持多核是一个开放的问题”。
你能帮我举个例子吗?我怎样才能创建自定义回购协议?
我的应用程序Context.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;
.....
}
有人能告诉我如何修改代码以实现SpringDataSolrWithSolr4.1Multicore中提到的自定义存储库吗?因为我无法理解此线程中建议的解决方案。
非常感谢提前。
当我按照答案中的建议这样做时,我得到了PersistenceExceptionTranslator异常,所以我手动初始化这个bean:
<beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>
存储库扫描将查找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配置进行配置。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()));
}
}
问题内容: 我的apache solr具有多个核心,例如货币,国家等。因此,使用Spring Data Solr可以从一个核心中检索信息。我现在已经获得了针对“ currency”核心的XML配置。如果我想查询“国家”核心,该如何设置? 并将存储库定义为 从我的服务中我可以做到这一点 我也尝试过使用@SolrDocument(solrCoreName =“ currency”),但是这行不通。 我
我有多核的apache solr,例如货币、国家等。。。因此,使用Spring Data Solr,我可以从一个核心检索信息。我现在已经获得了针对“货币”核心的XML配置查询。如果我想查询“国家”核心,我该如何设置? 并将存储库定义为 通过我的服务,我可以做到这一点 我也尝试过使用@SolrDocument(solrCoreName=“currency”),但这行不通。 我需要这个尽快的帮助...
对于使用具有多核支持的存储库使用solr设置Spring数据,是否有详细而完整的解释?
在我的项目中有几个实体具有相同的属性(对于示例'name'),所以,有可能创建一个存储库,其中使用自定义的select(实体)?因此,我从JpaRepository扩展了我的存储库,我扩展了MyCustomJpaRepository,MyCustomJpaRepository也扩展了JpaRepository,使其能够从JpaRepository授予基本功能? TKS
尝试从方法名生成查询时出错。然而,我可以使用其他已经在那里的。...等等。知道为什么吗? 实体 存储库 应用程序.属性 方法关键字:https://docs.spring.io/spring-data/solr/docs/1.2.0.rc1/reference/htmlsingle/
不幸的是,我不断得到以下异常: 原因:org.springframework.data.mapping.propertyreferenceException:在org.springframework.data.mapping.propertypath.create(propertypath.java:75)在org.springframework.data.mapping.propertypath