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的资料请关注脚本之家其它相关文章!

相关文章

  • javax.management.InvalidApplicationException的问题解决

    javax.management.InvalidApplicationException的问题解决

    javax.management.InvalidApplicationException是与Java Management Extensions (JMX) API相关的一个常见异常,本文主要介绍了javax.management.InvalidApplicationException的问题解决,感兴趣的可以了解一下
    2024-08-08
  • java synchronized的用法及原理详解

    java synchronized的用法及原理详解

    如果要保证并发情况下多线程共享数据的访问安全,操作的原子性,就可以使用synchronized关键字。这篇文章主要介绍了java synchronized的用法及原理,需要的朋友可以借鉴一下
    2021-08-08
  • Dubbo服务无法注册到ZK上问题

    Dubbo服务无法注册到ZK上问题

    这篇文章主要介绍了Dubbo服务无法注册到ZK上问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Springboot 集成 lombok.jar过程解析

    Springboot 集成 lombok.jar过程解析

    这篇文章主要介绍了Springboot 集成 lombok.jar过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 如何用Springboot快速整合shiro安全框架

    如何用Springboot快速整合shiro安全框架

    这篇文章主要介绍了如何用SpringBoot快速整合shiro安全框架,shiro原名Apache Shiro 是一个Java 的安全(权限)框架。Shiro 可以非常容易的开发出足够好的应用,感兴趣的同学可以参考阅读
    2023-04-04
  • 使用Java DOM解析器修改XML文件内容的操作方法

    使用Java DOM解析器修改XML文件内容的操作方法

    在Java中,XML文件的解析和修改可以通过多种方法实现,其中DOM(Document Object Model)是一种常用的方式,在本文中,我们将介绍如何使用Java DOM解析器修改XML文件中的内容,并给出一个具体的示例,需要的朋友可以参考下
    2024-08-08
  • Kotlin 和 Java 混合开发入门教程

    Kotlin 和 Java 混合开发入门教程

    这篇文章主要介绍了入门 Kotlin 和 Java 混合开发,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • MyBatisPlus条件构造器图文实例详解

    MyBatisPlus条件构造器图文实例详解

    这篇文章主要介绍了MyBatisPlus条件构造器,了解内部原理是为了帮助我们做扩展,同时也是验证了一个人的学习能力,如果你想让自己的职业道路更上一层楼,这些底层的东西你是必须要会的
    2023-01-01
  • SpringBoot整合Shiro静态资源拦截配置实践

    SpringBoot整合Shiro静态资源拦截配置实践

    本文介绍了Spring Boot整合Thymeleaf访问resources目录下static静态资源的方法,并提供三种解决方式,方法一通过修改访问路径,方法二在yml文件中修改配置,方法三通过创建statics目录并调整拦截配置来实现
    2026-05-05
  • maven profile动态选择配置文件详解

    maven profile动态选择配置文件详解

    这篇文章主要介绍了maven profile动态选择配置文件详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论