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

  • 相关阅读:
    flask cookies,session;flask session如何存在文件或者redis中
    requesets库请求返回json数据进 str in str 判断是无法找到对应关键字.
    resquests库get请求返回数据编码问题:可能是vscode自身 输出乱码
    Python 中json与字典的关系
    python pip :Fatal error in launcher: Unable to create process using '"'
    转载:关于js浮点数计算精度不准确问题的解决办法
    jQuery:使用toggle()方法导致元素消失的问题
    静态页面(一):原生JS模拟京东秒杀专场倒计时
    转载:深入理解css基线与行高
    JavaScript常见引用类型笔记(一):Array类型(上)
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/6556917.html
Copyright © 2011-2022 走看看