Spring MVC中创建Hibernate SessionFactory时出现NoClassDefFoundError求助
解决Spring MVC+Hibernate中SessionFactory创建失败的NoClassDefFoundError问题
问题描述
在配置Spring MVC整合Hibernate的SessionFactory时,遇到了上下文初始化异常,具体错误信息如下:
上下文初始化过程中遭遇异常,取消刷新操作:org.springframework.beans.factory.BeanCreationException: 创建ServletContext资源[/WEB-INF/spring-mvc-crud-demo-servlet.xml]中定义的名为'sessionFactory'的Bean失败;初始化方法调用失败;嵌套异常为java.lang.NoClassDefFoundError: net/bytebuddy/NamingStrategy$SuffixingRandom$BaseNameResolver。
对应的Spring配置文件代码如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- Add support for component scanning --> <context:component-scan base-package="com" /> <!-- Add support for conversion, formatting and validation support --> <mvc:annotation-driven/> <!-- Define Spring MVC view resolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> <!-- Step 1: Define Database DataSource / connection pool --> <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.cj.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimezone=UTC" /> <property name="user" value="root" /> <property name="password" value="DeepMYSQL9046!@" /> <!-- these are connection pool properties for C3P0 --> <property name="initialPoolSize" value="5"/> <property name="minPoolSize" value="5" /> <property name="maxPoolSize" value="20" /> <property name="maxIdleTime" value="30000" /> </bean> <!-- Step 2: Setup Hibernate session factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="packagesToScan" value="com" /> <property name="hibernateProperties"> <props> <prop key="hibernate5.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate5.show_sql">true</prop> </props> </property> </bean> <!-- Step 3: Setup Hibernate transaction manager --> <bean id="myTransactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- Step 4: Enable configuration of transactional behavior based on annotations --> <tx:annotation-driven transaction-manager="myTransactionManager" /> <!-- Add support for reading web resources: css, images, js, etc ... --> <mvc:resources location="/resources/" mapping="/resources/**"></mvc:resources> </beans>
错误原因分析
- ByteBuddy依赖缺失:报错里的
java.lang.NoClassDefFoundError指向ByteBuddy的类,说明项目里没引入这个依赖。Hibernate 5及以上版本依赖ByteBuddy做字节码增强,必须要加这个包才能正常初始化SessionFactory。 - Hibernate配置键错误:你配置里把Hibernate的属性键写成了
hibernate5.dialect和hibernate5.show_sql,正确的键应该是hibernate.dialect和hibernate.show_sql,多出来的5会导致Hibernate识别不了这些配置,间接影响初始化。 - 方言版本不匹配:你用的是MySQL 8.x的驱动
com.mysql.cj.jdbc.Driver,但配置的方言是旧版的MySQLDialect,这也可能引发兼容性问题。
解决方案
1. 补充ByteBuddy依赖
如果用Maven,直接在pom.xml里加这段依赖:
<dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.10.19</version> <!-- 选和你Hibernate版本兼容的稳定版即可 --> </dependency>
要是手动管理jar包,就下载ByteBuddy的jar文件放到项目的WEB-INF/lib目录下。
2. 修正Hibernate配置属性
修改sessionFactory里的hibernateProperties部分,把属性键的hibernate5改成hibernate,同时替换成适配MySQL 8的方言:
<property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property>
3. 检查其他依赖完整性
确保项目里已经包含Hibernate 5核心依赖、Spring ORM依赖以及C3P0连接池的完整jar包,避免其他依赖缺失拖后腿。
做完这些操作后,重新部署项目,应该就能顺利初始化SessionFactory了。
内容的提问来源于stack exchange,提问作者Deep Ghosh
相关产品推荐
相关产品推荐

