1 前言
最近在教人使用SpringMVC,在运行过程中,有不少人遇到了这个问题,即“class path resource [com/xxx/entity/User.hbm.xml] cannot be opened because it doesn't exist”,但在项目的工程目录中,.hbm.xml又确实存在,这个问题如此诡异,所以特此在这里进行记录。
2 环境和工具
SpringMVC4.3.18,Hibernate5.4.3.Final,Idea。
3 解决方案
先去你的项目的classes目录下,检查classes编译文件夹的同名目录下是否存在你的映射文件。因为Spring在加载映射文件时加载的是你classes编译文件夹下的配置文件而不是你src目录下的。所以很多人出问题出在这一步,classes目录下只有class字节码文件并没有与之对应的xml文件。所以有些同学将其手动复制进去,但是只要一clean,文件就又被清除了,是不是很诡异?其实,一切都是很简单的一个原因。因为没有在pom文件中配置如下设置:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
只要配置了,一切就恢复正常了,如果配置之后又出现找不到applicationContext.xml的错误,可以在加上,如下代码:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
一切问题迎刃而解,哈哈哈。
当然啦,如果你不是因为这个问题,这里提供其他的参考建议:
1:检查xxx.hbm.xml文件的class中的name全路径是否正确。有时候你通过逆向工程的生成的的映射文件的全类名和你映射文件的包名是不同的。
2:clean项目重新加载Tomcat。
3:检查导入hibernate的映射文件的方法是否正确。