一個由於springboot自動配置所產生的問題的解決


  由於我的項目里面需要使用到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屬性指定需要排除的自動配置類即可.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM