Hibernate构建SessionFactory报UnmarshalException异常问题
问题定位
抛出javax.xml.bind.UnmarshalException并提示session-factory元素的内容类型为仅允许嵌套子元素,不能包含字符类子节点,是典型的hibernate.cfg.xmlXML格式非法问题:<session-factory>标签内部存在未被合法XML标签包裹的文本节点,和使用的Tomcat、JDK、Hibernate版本本身没有直接关系。
常见触发场景:
- 配置编写时在标签间隙误输入了零散文字、乱码字符
- XML注释格式错误,比如漏写注释闭合符
-->,导致注释内容被解析为普通文本 - 配置项书写错误,把本该放在
<property>等标签内部的参数值写到了标签外部 - 从网页/文档复制配置时带入了不可见特殊字符(零宽空格、全角空格、控制字符等),这类字符不会在编辑器里正常显示,但会被XML解析器识别为文本节点
修复步骤
- 直接跳转到
hibernate.cfg.xml第17行第27列的报错位置,逐字符检查<session-factory>开标签到对应</session-factory>闭标签之间的所有内容:- 所有非注释内容必须包裹在合法的配置标签(
<property>、<mapping>等)内部 - 所有注释必须严格符合
<!-- 注释文本 -->格式,不能漏写两端的标记 - 直接删除所有不在标签包裹范围内的零散字符
- 所有非注释内容必须包裹在合法的配置标签(
- 如果肉眼找不到异常字符,可以把
<session-factory>标签对之间的所有内容剪切到纯文本编辑器(比如系统自带记事本)清除格式,核对配置项无误后再粘贴回原文件,能一次性清除所有不可见特殊字符 - 保存配置后重启Tomcat验证,正常情况下
SessionFactory实例可以正常初始化,不会再返回null
兼容兜底校验
如果修复XML格式后仍报错,再核对两个JDK11适配点:
- JDK11移除了默认内置的JAXB组件,Hibernate 5.4解析配置时依赖这个包,需要在
pom.xml中补充依赖:
<!-- JDK11+ 适配Hibernate所需JAXB依赖 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.1</version> </dependency>
- 确认
hibernate.cfg.xml放在项目的类加载根路径(一般是src/main/resources目录),避免FactoryProvider读取到损坏的错误配置文件。
内容的提问来源于stack exchange,提问作者Pankaj Yadav
相关产品推荐
相关产品推荐

