由於我的項目里面需要使用到solr,我做了一下solr和springboot的整合,結果啟動項目的時候,就報錯了...報錯的信息的第一行提示如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'solrClient' defined in class path resource [org/springframework/boot/autoconfigure/solr/SolrAutoConfiguration.class]:
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException:
Failed to instantiate [org.apache.solr.client.solrj.SolrClient]:
Factory method 'solrClient' threw exception;
nested exception is java.lang.NoSuchMethodError: org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(Lorg/apache/solr/common/params/SolrParams;)
Lorg/apache/http/impl/client/CloseableHttpClient;
我的和solr相關的pom坐標如下:
<!-- solr -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>
我的SolrClient相關的配置如下:
@Configuration
public class SolrConfig {
@Bean
public HttpSolrClient solr() throws MalformedURLException {
HttpSolrClient server=new HttpSolrClient("http://192.168.200.130:8080/solr");
return server;
}
}
我當時就郁悶了,因為實際上我啟動的這個項目並沒有使用到solr..和solr相關的類在另外一個應用里面,只是這兩個應用都是一個父模塊下面的子模塊,而所有的坐標我聲明在父模塊里面.因此,我第一時間想到的是可能會存在jar包的沖突,因此我做了很多嘗試例如使用spring-data-solr坐標,或者springboot-starter-solr的坐標,結果發現都沒有用,后來我跟進斷點后,一步步跟着源碼走,發現在應用啟動的時候,springboot就給我創建了一個HttpSolrClient,而這個錯誤就是在springboot創建HttpSolrClient的時候報錯的.說是找不到方法..不過,考慮到我也不需要去使用springboot的自動創建HttpSolrClient特性,畢竟SolrClient我們自己創建了並且放到了spring容器中了..因此我們必須要禁用springboot和solr相關的自動配置.在網上經過一番查找后,最終我通過在App啟動類上指定禁止相應的自動配置類(根據報錯的信息,就是SolrAutoConfiguration這個類)解決了這個問題.如下:
@SpringBootApplication(exclude=SolrAutoConfiguration.class)
@ImportResource(locations="classpath:conf/dubbo.xml")
public class App extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(App.class);
}
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
這個問題實際上也告訴我們,springboot的自動配置有時候也不是萬能的,面對具體的情境,如果需要禁用某些配置,就在啟動類上的@SpringBootApplication的exclude屬性指定需要排除的自動配置類即可.
