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

  • 相关阅读:
    不可或缺 Windows Native (15)
    不可或缺 Windows Native (14)
    不可或缺 Windows Native (13)
    不可或缺 Windows Native (12)
    不可或缺 Windows Native (11)
    不可或缺 Windows Native (10)
    不可或缺 Windows Native (9)
    不可或缺 Windows Native (8)
    不可或缺 Windows Native (7)
    不可或缺 Windows Native (6)
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/6556917.html
Copyright © 2011-2022 走看看