Spring Boot XSD1.1校验XML报UTF16类缺失及断言配置问题
问题根因
报错和XML编码无关,核心原因有两点:
- JDK内置的XML解析器仅支持XSD 1.0规范,代码中指定创建XSD 1.1版本的
SchemaFactory,运行<xs:assertion>这类XSD 1.1专属特性时,需要依赖第三方XSD 1.1实现库。 - 项目中引入的XSD 1.1实现(通常是Apache Xerces XSD1.1版本)在执行断言的字符串长度、Unicode字符处理逻辑时,依赖IBM ICU4J库的
com.ibm.icu.text.UTF16类,项目中缺失该依赖就会抛出NoClassDefFoundError。
注释掉assertion片段后,代码不会触发XSD 1.1专属逻辑的类加载,所以校验能正常执行。
修复方案
根据是否需要保留XSD 1.1断言特性,二选一即可:
方案一:不使用XSD 1.1专属特性
如果不需要保留<xs:assertion>,直接切换到XSD 1.0规范,无需额外引入依赖:
- 修改SchemaFactory初始化代码,替换为XSD 1.0的标准标识:
// 原v1.1标识替换为XSD 1.0标识 SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
- 将XSD中的断言长度校验替换为XSD 1.0原生支持的
maxLength约束:
<xs:simpleType name="nameNType"> <xs:restriction base="xs:string"> <xs:maxLength value="65"/> </xs:restriction> </xs:simpleType>
改完直接运行即可正常校验,不会再抛出类找不到的错误。
方案二:保留XSD 1.1断言片段
如果业务上必须保留<xs:assertion>(比如后续需要实现复杂的跨字段、正则组合校验),不需要调整文件编码为UTF-8,只要补全缺失的依赖即可:
如果是Maven管理的Spring Boot项目,在pom.xml中添加以下依赖:
<dependency> <groupId>org.opengis.cite.xerces</groupId> <artifactId>xercesImpl-xsd11</artifactId> <version>2.12-beta-r1667115</version> </dependency> <dependency> <groupId>com.ibm.icu</groupId> <artifactId>icu4j</artifactId> <version>74.1</version> </dependency>
如果是Gradle项目,添加以下配置:
implementation 'org.opengis.cite.xerces:xercesImpl-xsd11:2.12-beta-r1667115' implementation 'com.ibm.icu:icu4j:74.1'
依赖引入后重启项目,原有校验代码和XSD断言片段不需要改动,即可正常执行校验。
额外提醒:当前代码的catch块仅调用
ex.getMessage()没有打印日志或抛出异常,校验失败时会静默吞掉错误,建议调整为日志打印或抛出对应业务异常,避免问题排查困难。
内容的提问来源于stack exchange,提问作者Jessica Cathrine
相关产品推荐
相关产品推荐

