Spring JDBC报错NoClassDefFoundError及Bean无法访问问题求助
Spring JDBC操作数据库出现NoClassDefFoundError及Bean获取失败问题解决
我尝试使用Spring JDBC操作数据库,但运行时抛出NoClassDefFoundError,错误栈显示找不到org.springframework.core.metrics.ApplicationStartup类。同时分别采用XML配置和注解配置两种方式获取Bean,均无法成功访问。已添加spring-boot-starter-web 2.3.3.RELEASE依赖,相关错误信息及代码如下:
错误信息:Error :-NoClassDefFoundError
12:19:07.250 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@24b1d79b Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup at org.springframework.beans.factory.support.AbstractBeanFactory.<init>(AbstractBeanFactory.java:184) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.<init>(AbstractAutowireCapableBeanFactory.java:176) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.<init>(AbstractAutowireCapableBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.<init>(DefaultListableBeanFactory.java:201) at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:197) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:127) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:638) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85) at jdbc.mainioc.main(mainioc.java:12) Caused by: java.lang.ClassNotFoundException: org.springframework.core.metrics.ApplicationStartup at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ... 11 more
相关代码
XML配置方式主测试类
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; public class mainioc { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("Appmeta.xml"); JdbcTemplate temp= (JdbcTemplate) ctx.getBean("dataS"); //insert query String query="insert into employee(id,name,salary) values(?,?,?)"; //fire query int result=temp.update(query,3,"ram",14578); System.out.println("record inserted"+ result ); } }
当前添加的依赖
<dependency> org.springframework.boot spring-boot-starter-web 2.3.3.RELEASE </dependency>
实体类
package com.spjdbc.entity; public class student { private String id; private String Sname; private String Srollno; @Override public String toString() { return "student [id=" + id + ", Sname=" + Sname + ", Srollno=" + Srollno + "]"; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSname() { return Sname; } public void setSname(String sname) { Sname = sname; } public String getSrollno() { return Srollno; } public void setSrollno(String srollno) { Srollno = srollno; } }
XML配置文件(Appmeta.xml)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="DataS" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/studentdb"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <bean id="jdbcB" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="DataS"/> </bean> </beans>
注解方式测试类
package com.spjdbc.ioc; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; public class iocmain { public static void main(String[] args) { ApplicationContext cont= new AnnotationConfigApplicationContext("com/spjdbc/ioc/BeanConf.class"); JdbcTemplate temp= cont.getBean(JdbcTemplate.class); String query="insert into student(id,Sname,Srollno) values(?,?,?)"; int result = temp.update(query,1,"ram",24001); System.out.println("intert the value" +result); } }
注解配置类
package com.spjdbc.ioc; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; @Configuration public class BeanConf { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/studentdb"); dataSource.setUsername("root"); dataSource.setPassword("root"); return dataSource; } @Bean public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(dataSource()); } }
问题解决步骤
1. 修复依赖缺失与格式问题
org.springframework.core.metrics.ApplicationStartup属于Spring Core模块,仅引入spring-boot-starter-web会缺少JDBC相关核心依赖。直接引入spring-boot-starter-jdbc,它会自动管理所有Spring JDBC所需依赖,避免版本冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>2.3.3.RELEASE</version> </dependency>
同时修正spring-boot-starter-web的依赖格式:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.3.RELEASE</version> </dependency>
2. 补充MySQL驱动依赖
使用com.mysql.cj.jdbc.Driver需要添加MySQL驱动:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> <scope>runtime</scope> </dependency>
3. 修复XML配置的Bean获取错误
XML中JdbcTemplate的Bean id是jdbcB,代码中错误使用dataS获取,修改为:
JdbcTemplate temp= (JdbcTemplate) ctx.getBean("jdbcB");
4. 修复注解配置的上下文初始化错误
AnnotationConfigApplicationContext构造参数需传入配置类的Class对象,而非带.class后缀的字符串,修改为:
ApplicationContext cont= new AnnotationConfigApplicationContext(BeanConf.class);
内容的提问来源于stack exchange,提问作者Ruchi Gupta
相关产品推荐
相关产品推荐

