1

我正在使用带有自定义存储库功能的 Spring data Solr 1.4 来尝试按照本文实现计数功能:链接

我正在使用配置为使用多个内核的 Solr。我的常规存储库接口获取并使用正确的SolrTemplateSolrServer实例,但自定义存储库没有获取模板的相同实例。除了使用@Resource注入 bean 之外,我还尝试获取 spring 应用程序上下文并从中提取 bean。在这两种情况下,我都会得到一个solrServer不知道我的核心是什么的 bean 引用,因此当它尝试在以下位置到达 solr 时查询失败:http://localhost:8983/solr而不是http://localhost:8983/solr /我的核心

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;
}

我的测试看起来像这样:

@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

关于我可能在这里配置错误的任何建议?任何/所有回复表示赞赏!

——格里夫

4

1 回答 1

0

通过创建第二个相同类型的 bean 并为其添加限定符,我自己解决了这个问题。

在我的 SolrContext 中,我这样定义了 bean 工厂和 bean 定义: @Bean public SolrServerFactory solrServerFactory() { return new MulticoreSolrServerFactory(new 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);
}
...

}

希望这对其他人有帮助。

——格里夫

于 2015-06-16T14:53:09.667 回答