IntelliJ搭建Spring MVC+Hibernate项目反复报错 出现tx命名空间解析异常
Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/tx]报错的核心触发原因是:tx事务命名空间对应的实现包未被加载到Web应用的运行时classpath中。
当前使用IDEA右键「Add framework support」自动添加依赖的方式存在固有缺陷:该操作只会将基础Spring核心包复制到项目lib目录,不会自动关联spring-tx、spring-orm、spring-aop这类和事务、AOP、ORM整合相关的依赖,也不会自动将依赖同步到Maven配置、部署到Tomcat应用目录,这也是重复创建项目时反复出现随机异常的核心原因。
第一步:全量替换IDEA自动添加的lib依赖,所有依赖通过Maven统一管理
打开项目根目录的pom.xml,替换原有的零散依赖配置,加入和你当前使用版本完全匹配的依赖坐标,避免版本不一致导致的类冲突:<dependencies> <!-- Spring 核心组件,版本统一使用5.2.3.RELEASE --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.2.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.3.RELEASE</version> </dependency> <!-- Hibernate 5.4.11 整合依赖 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.11.Final</version> </dependency> <!-- 数据源、数据库驱动依赖 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!-- Web 应用基础依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- AOP 依赖(支持aspectj自动代理) --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.15</version> </dependency> </dependencies>配置完成后,删掉项目里手动创建的
lib目录下所有手动复制的jar包,避免和Maven管理的依赖版本冲突。第二步:修复IDEA部署Artifact配置,确保所有依赖被正确打包到应用目录
打开File -> Project Structure -> Artifacts,选中你部署到Tomcat的Exploded WAR配置:- 在右侧的
Available Elements面板中,找到所有标记为Maven: ...的依赖项,全部双击添加到WEB-INF/lib目录下 - 不要留下任何未添加的依赖项,避免Tomcat启动时找不到类
- 在右侧的
第三步:校验配置文件路径正确性
检查web.xml中配置的contextConfigLocation值/WEB-INF/spring-mvc-crud-demo-servlet.xml:- 确认该文件确实存在于
WEB-INF目录下,文件名和配置值完全一致,不要有大小写、拼写差异 - 确认Spring xml配置中schemaLocation的地址没有多余空格、拼写错误,和你提供的配置内容保持一致即可
- 确认该文件确实存在于
第四步:清理缓存后重新构建启动
打开File -> Invalidate Caches...,选择清理所有缓存并重启IDEA,完成后执行Build -> Rebuild Project,再启动Tomcat验证报错是否消失。
- 不要混用IDEA自动生成的lib包和Maven管理的依赖,版本不一致时会随机触发类加载失败的问题,全项目统一通过Maven维护版本即可避免
- 不要在同一个Tomcat实例上部署多个不同版本的Spring项目,避免类加载顺序混乱导致的命名空间解析失败
- 确保MySQL本地服务正常启动,数据库
web_customer_tracker已创建,数据库账号springstudent拥有对应库的访问权限
内容的提问来源于stack exchange,提问作者Stefan Jankovic

