我希望使用spring-data-solr在一个服务中访问多个/ 2个repos。 从Spring Data Solr multiple cores and repository我知道'通过命名空间配置支持多核支持是一个未解决的问题'。
您能否帮我解决以下示例,如何创建自定义Repos?
我的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 with Solr 4.1 multicores中提到的自定义存储库?因为我无法理解这个帖子中的建议解决方案。
非常感谢提前。
答案 0 :(得分:5)
存储库扫描将查找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()));
}
}
答案 1 :(得分:0)
当我在答案中建议这样做时,我得到了PersistenceExceptionTranslator异常,所以我手动初始化这个bean:
<beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>