• 一个由于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属性指定需要排除的自动配置类即可.

  • 相关阅读:
    第十四周课程总结&实验报告
    第十三周学习总结&实验报告(八)
    第十二周学习总结
    第十一周课程总结
    第十周课程总结
    实验报告(七)&第九周课程总结
    软件工程作业02
    第一周博客作业
    2019春总结作业
    第十二周作业
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/6556917.html
Copyright © 2020-2023  润新知