注入的SolrTemplate资源未连接到HttpSolrServer

时间:2015-06-13 14:29:24

标签: java spring solr spring-boot spring-data-solr

我正在使用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)

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

- 格里夫

1 个答案:

答案 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);
}
...

}

希望这有助于其他人。

- 格里夫