Spring5+Hibernate5中LocalSessionFactoryBean的mappingDirectoryLocations配置失效问题
解决Weblogic部署Spring+Hibernate时的FileNotFoundException问题
嘿,这个问题我之前在Weblogic上部署Spring应用时也碰到过!本质原因是Weblogic默认不会自动展开WAR包,而你用的mappingDirectoryLocations属性是直接去文件系统找对应的目录——但WAR没展开的话,这个路径其实是在压缩包内部的资源,根本不是文件系统里的真实目录,自然就报找不到文件的错误了。
下面给你几个实用的解决方案:
解决方案1:让Weblogic自动展开WAR包
你可以修改Web应用的weblogic.xml配置文件,强制Weblogic部署时展开WAR包:
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd"> <!-- 添加这行配置,开启WAR自动解压 --> <unpack-war>true</unpack-war> </weblogic-web-app>
这样Weblogic部署时会把WAR解压到文件系统,mappingDirectoryLocations就能找到对应的目录了。不过这种方式依赖服务器配置,如果换个环境可能还要重新设置。
解决方案2:改用类路径方式加载映射文件(推荐)
不需要依赖服务器配置,直接修改LocalSessionFactoryBean的配置,用mappingLocations来指定类路径下的映射文件,这样不管WAR是否展开,Spring都能通过类加载器读取资源:
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 匹配指定包下所有的.hbm.xml映射文件 --> <property name="mappingLocations" value="classpath*:com/myorg/division/myapp/model/**/*.hbm.xml" /> <!-- 别忘了加上数据源、Hibernate属性等其他配置 --> </bean>
这里的classpath*:表示扫描所有类路径下的资源,**/*.hbm.xml会递归查找指定包下的所有Hibernate映射文件,适配性更强。
解决方案3:用注解映射+包扫描(更简洁)
如果你的实体类用的是Hibernate注解(比如@Entity、@Table),那完全可以不用维护XML映射文件,直接让Spring扫描指定包下的实体类:
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 扫描指定包下的所有实体类,自动识别注解映射 --> <property name="packagesToScan" value="com.myorg.division.myapp.model" /> <!-- 其他必要配置 --> </bean>
这种方式最简洁,也避免了手动维护映射文件的麻烦,是现在Spring+Hibernate整合的主流做法。
内容的提问来源于stack exchange,提问作者Kingamere
相关产品推荐
相关产品推荐

