我正在使用Spring数据Solr 1.4和自定义存储库功能来尝试按照本文实现计数功能:link
我正在使用Solr配置为使用多个核心。我的常规存储库接口获取并使用正确的SolrServer
和@Resource
实例,但自定义存储库不会获得相同的模板实例。除了使用solrServer
注入bean之外,我还尝试获取spring应用程序上下文并从中提取bean。在这两种情况下,我都得到一个@Bean
@Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)
public SolrServer solrServer() {
SolrServer server = new HttpSolrServer(solrServerUrl);
return server;
}
@Bean(name = "solrTemplate")
@Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)
public SolrTemplate solrTemplate(SolrServer server) throws Exception {
SolrTemplate template = new SolrTemplate(server);
template.setSolrCore(mainCore);
return template;
}
bean引用,它不知道我的内核是什么,因此当它尝试在http://localhost:8983/solr而不是http://localhost:8983/solr/myCore
bean定义如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SearchEngineApplication.class, loader=SpringApplicationContextLoader.class)
public class MainRepositoryTest {
@Autowired
private MainRepository mainRepository;
...
@Test
public void testCountResults(){
long count= citcMainRepository.count("red");
System.out.println("Found " + count + " results for the term red" );
assertTrue(count > 0);
}
}
我的测试看起来像这样:
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /solr/select
测试总是失败:
/solr/select/myCore
当它应该到达的正确网址为stars[i].x = Math.floor(Math.random() * w)
有关我可能在这里配置错误的建议吗? 任何/所有回复表示赞赏!
- 格里夫
答案 0 :(得分:0)
我能够通过创建相同类型的第二个bean并为其添加限定符来解决问题。
在我的SolrContext中,我定义了bean工厂和bean定义: @豆 public SolrServerFactory solrServerFactory(){ 返回新的MulticoreSolrServerFactory(新的HttpSolrServer(solrServerUrl)); }
// SolrTemplate for /solrServerUrl/mainCore
@Bean(name = "mainTemplate")
public SolrTemplate mainTemplate() throws Exception {
SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory());
solrTemplate.setSolrCore(mainCore);
return solrTemplate;
}
@Bean(name="mainRepo")
public MainRepository mainRepository() throws Exception {
return new SolrRepositoryFactory(mainTemplate())
.getRepository(CITCMainRepository.class,
new MainRepositoryImpl(mainTemplate()));
}
然后通过在我的UnitTest中对存储库进行限定:
公共类CITCMainRepositoryTest {
@Autowired
@Qualifier(value="mainRepo")
private MainRepository mainRepository;
@Test
public void testFindByLastName() {
List<SearchResponse> searchItems= mainRepository.findByLastName("Hunt");
assertTrue(searchItems.size() > 0);
}
...
}
希望这有助于其他人。
- 格里夫