题目中描述的异常信息 "Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoSuchMethodError:" 实际上提供了有用的提示信息,可以作为排除问题的起点。异常信息中的 "Factory method 'sqlSessionFactory' threw exception" 表示在创建 SqlSessionFactory 对象时,工厂方法出现异常。而 "nested exception is java.lang.NoSuchMethodError:" 则提示我们该异常的具体原因是缺少某个方法。
通常情况下,造成 "NoSuchMethodError" 异常的原因有以下几种:
- 使用老版本的 jar 包,其中的类或方法已经过时或被移除;
- 类和方法的签名发生了更改,但是相关的代码没有跟着修改;
- 类加载器的问题,例如同一个类被不同的类加载器加载。
对于 "java.lang.NoSuchMethodError" 异常,我们可以采用以下几种方法进行排查:
- 检查 jar 包的版本以及其依赖包的版本,尽量使用稳定版本的 jar 包来避免以上问题;
- 使用工具类(例如 Maven Dependency Plugin 或 Gradle 的 Dependencies Task)检查代码所依赖的 jar 包是否存在冲突;
- 通过日志信息(例如堆栈轨迹)找到异常抛出的位置,尝试手动排除该位置及其依赖的代码中是否使用了过时或不存在的类或方法。
下面提供两个具体的案例来说明如何排查 "java.lang.NoSuchMethodError" 异常。
案例一:Spring Boot 项目启动报错
异常信息如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.test.MybatisPlusConfig': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.mybatis.spring.SqlSessionFactoryBean.setMapperLocations([Lorg/springframework/core/io/Resource;)V
...
Caused by: java.lang.NoSuchMethodError: org.mybatis.spring.SqlSessionFactoryBean.setMapperLocations([Lorg/springframework/core/io/Resource;)V
...
问题分析:
根据异常信息提示,发现是 SqlSessionFactoryBean
类的 setMapperLocations
方法不存在,导致初始化 MybatisPlusConfig
失败。经过检查,发现项目中使用的 mybatis-spring-boot-starter
依赖的版本过低(1.2.0),而该方法在高版本的 mybatis-spring
中已经被移除。因此,我们需要升级该依赖的版本,或者手动实现 SqlSessionFactoryBean
。
案例二:Java Spring MVC 项目启动报错
异常信息如下:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springBeanConfiguration' defined in file [/path/to/workspace/SpringMVC/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/SpringMVC/WEB-INF/classes/com/mypackage/SpringBeanConfiguration.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mypackage.SpringBeanConfiguration$$EnhancerBySpringCGLIB$$a3f882f8]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError:org.springframework.beans.factory.support.PropertiesBeanDefinitionReader.setEnvironment(Lorg/springframework/core/env/Environment;)V
...
Caused by: java.lang.NoSuchMethodError: org.springframework.beans.factory.support.PropertiesBeanDefinitionReader.setEnvironment(Lorg/springframework/core/env/Environment;)V
...
问题分析:
根据异常信息提示,发现是 PropertiesBeanDefinitionReader
类的 setEnvironment
方法不存在,导致初始化 SpringBeanConfiguration
失败。经过检查,发现项目中使用的 Spring Framework 依赖的版本过低(4.1.7),而该方法在高版本的 Spring Framework 中已经被添加。因此,我们需要升级该依赖的版本,或者手动实现 PropertiesBeanDefinitionReader
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java异常 Factory method’sqlSessionFactory’rew exception;ested exception is java.lang.NoSuchMethodError: - Python技术站