springboot自动装配TypeNotPresentExceptionProxy异常排查解决

 更新时间:2023年09月19日 10:53:17   作者:linyb极客之路  
这篇文章主要为大家介绍了springboot自动装配TypeNotPresentExceptionProxy异常排查解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

正文开始前,我们做个小测试,假设我们封装了一个springboot starter,其自动装配类形如下内容

@Configuration
@EnableConfigurationProperties({ApolloRefreshProperties.class})
public class ApolloRefreshAutoConfiguration  {

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnClass({ConfigService.class})
    public ApolloRefreshService apolloRefreshService(ApolloRefreshProperties properties) {
        return new ApolloRefreshService(properties);
    }
    }

该starter的pom引入的apollo gav是optional

<dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>${apollo-client.version}</version>
            <optional>true</optional>
        </dependency>

我的问题是

在运行环境为jdk8的springboot项目引入上述的starter,是否会有问题?

我们运行一下,发现会出现

然后我们不改任何一行代码,把JDK调成11或者以上版本,再运行

项目成功运行。那我们的修复的第一直觉是不是把JDK8的版本提高。

我们团队的小伙伴第一时间也是这么干的,他去和业务团队的技术经理沟通,看他们能不能把JDK8调整成JDK11,然后得到了业务团队技术经理的高度否定,因为他们大部分业务都跑在jdk8,冒然升级成jdk11,也不知道会不会因为了解决一个问题,而引入其他问题

问题排查

因为这个starter的自动装配配置的内容相对简单,基于老司机的第六感,问题大概率是出现在@ConditionalOnClass这注解上,于是点开@ConditionalOnClass,他的注解上有如下提示

他的大意是,可以在@Configuration classes上安全地指定value(),因为在加载类之前会使用ASM解析注释元数据。当放置在@Bean方法上时,需要格外小心,请考虑在单独的Configuration类中隔离条件,特别是当方法的返回类型与条件的目标匹配时。如果非要用方法注解,建议使用ConditionalOnClass里面的name字段

于是我们听官方的建议,将starter调整如下

@Configuration
@EnableConfigurationProperties({ApolloRefreshProperties.class})
public class ApolloRefreshAutoConfiguration  {
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnClass(name = "com.ctrip.framework.apollo.ConfigService")
    public ApolloRefreshService apolloRefreshService(ApolloRefreshProperties properties) {
        return new ApolloRefreshService(properties);
    }
    }

再次运行,果然不再报错。具体问题原因,我就不班门弄斧了,可以查看官方的issue

https://github.com/spring-projects/spring-boot/issues/27846

https://github.com/spring-projects/spring-boot/issues/17282

总结

首先如果用 @ConditionalOnClass注解,强烈建议使用name属性,而不要用value属性。其次如果有提供组件给其他业务团队使用,要特别关注版本问题,以及做好向下兼容,不然指不定又掉坑了。

以上就是springboot自动装配TypeNotPresentExceptionProxy异常排查解决的详细内容,更多关于springboot TypeNotPresentExceptionProxy的资料请关注脚本之家其它相关文章!

相关文章

  • MyBatis二级缓存实现关联刷新

    MyBatis二级缓存实现关联刷新

    本文主要介绍了MyBatis二级缓存实现关联刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java 8对LinkedHashSet元素进行排序的操作方法

    Java 8对LinkedHashSet元素进行排序的操作方法

    LinkedHashSet 是 Java 集合框架中的一个类,它继承自 HashSet,并实现了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它仅仅保持插入顺序,所以本文给大家介绍了Java 8 如何对 LinkedHashSet 元素进行排序,需要的朋友可以参考下
    2024-11-11
  • Java老矣 尚能饭否?

    Java老矣 尚能饭否?

    Java老矣,尚能饭否?各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样?
    2017-06-06
  • SpringCloud微服务中跨域配置的方法详解

    SpringCloud微服务中跨域配置的方法详解

    在使用SpringCloud实现微服务时,经常会碰到前端页面访问多个二级域名的情况,跨域是首先要解决的问题。解决这个问题,可以从两方面入手,一种方案是在微服务各自的业务模块中实现,即在SpringBoot层实现,另外一种方案就是在Gateway层实现
    2023-02-02
  • Java中Controller、Service、Dao/Mapper层的区别与用法

    Java中Controller、Service、Dao/Mapper层的区别与用法

    在Java开发中,通常会采用三层架构(或称MVC架构)来划分程序的职责和功能,分别是Controller层、Service层、Dao/Mapper层,本文将详细给大家介绍了三层的区别和用法,需要的朋友可以参考下
    2023-05-05
  • Java编程实现排他锁代码详解

    Java编程实现排他锁代码详解

    这篇文章主要介绍了Java编程实现排他锁的相关内容,叙述了实现此代码锁所需要的功能,以及作者的解决方案,然后向大家分享了设计源码,需要的朋友可以参考下。
    2017-10-10
  • Spring Boot 自定义starter的示例代码

    Spring Boot 自定义starter的示例代码

    这篇文章主要介绍了Spring Boot 自定义starter的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • SpringCloud之LoadBalancer负载均衡服务调用过程

    SpringCloud之LoadBalancer负载均衡服务调用过程

    这篇文章主要介绍了SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • java 后台将base64字符串保存为图片的方法

    java 后台将base64字符串保存为图片的方法

    本篇文章主要介绍了java 后台将base64字符串保存为图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • SpringMVC转发与重定向参数传递的实现详解

    SpringMVC转发与重定向参数传递的实现详解

    这篇文章主要介绍了SpringMVC转发与重定向参数传递,对于重定向,可以通过FlashMap或RedirectAttributes来在请求间传递数据,因为重定向涉及两个独立的HTTP请求,而转发则在同一请求内进行,数据可以直接通过HttpServletRequest共享,需要的朋友可以参考下
    2022-07-07

最新评论