开发者社区> 问答> 正文

spring boot 升级到2.2之后启动报错; 无法注入HttpTraceFilter;?报错

然后我在启动类上手动注入,@Import(HttpTraceFilter.class)

依然启动报错

No qualifying bean of type 'javax.servlet.Filter' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value="httpTraceFilter")}

退回到2.1.8之后一切正常;

展开
收起
爱吃鱼的程序员 2020-06-05 14:58:29 998 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>从springboot 2.2.0.M3开始,HttpTraceRepository将变成条件式声明,不再通过自动配置声明。就是默认禁用了management.trace.http</p> 
    

    具体请看:Disable management.trace.http by default #15039

    解决办法是用@Conditional注解进行条件式声明,例如

    @ConditionalOnMissingBean
    @Bean
    public HttpTraceRepository httpTraceRepository() {
      return new InMemoryHttpTraceRepository();
    }

    结论:由于HttpTraceRepository变成条件式声明,因为顶层调用InMemoryHttpTraceRepository的servlet拦截器HttpTraceFilter默认也是不会通过auto-configuration自动声明bean, 你去要自已声明或通过条件式声明解决问题。

    如果对你有用,请采纳

                            回复 <a class="referer" target="_blank">@CielSwift</a>  : <a class="referer" target="_blank">@Bean</a> 
    	@ConditionalOnMissingBean
    	HttpTraceFilter httpTraceFilter(HttpTraceRepository repository, HttpExchangeTracer tracer) {
    		return new HttpTraceFilter(repository, tracer);
    	}
                        
    
                            回复 <a class="referer" target="_blank">@CielSwift</a>  : @Import是依赖第三方包中的配置声明bean,但HttpTraceFilter在spring-boot-actuator-autoconfigure包中的配置类,已变成条件式声明,必须在BeanFactory中有HttpTraceRepository和HttpExchangeTracer的bean,才会自动配置声明。
                        
    
                            感谢;我不太明白的是 为什么 @Import(HttpTraceFilter.class)无效呢?
    
    2020-06-05 14:58:45
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载