Java 17+Gradle环境下JAXB XJC UTF-8转Unicode反序列化问题
Gradle + JAXB 处理含UTF-8俄文Schema的反序列化问题
在Windows系统下构建基于Gradle的Java 17应用,需通过包含UTF-8俄文符号的XSD Schema将XML反序列化为Java类,过程中遇到以下问题:
- 初始阶段无法生成带有原UTF-8俄文名称的类,添加编码参数后编译恢复正常
- 运行时JAXB注解(如
@XmlElement)中的Unicode转义字符导致反序列化完全失败,应用报错提示XML文件从第一个字符开始就不正确
生成的代码示例
@XmlElement(name = "\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435\u0421\u0447\u0435\u0442\u043e\u0432") protected ОткрытиеСчетов открытиеСчетов;
注解中name属性的预期值为ОткрытиеСчетов
Gradle中JAXB生成任务代码
configurations { jaxb } dependencies { implementation("org.glassfish.jaxb:jaxb-runtime:4.0.2") implementation("jakarta.xml.bind:jakarta.xml.bind-api:4.0.2") jaxb "com.sun.xml.bind:jaxb-xjc:4.0.2" jaxb "org.glassfish.jaxb:jaxb-runtime:4.0.2" jaxb "jakarta.xml.bind:jakarta.xml.bind-api:4.0.2" } tasks.register('xjcGenerate') { def generatedSourcesDir = file("$buildDir/generated/sources/xjc") outputs.dir generatedSourcesDir doLast { ant.taskdef( name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.jaxb.asPath ) ant.xjc( destdir: generatedSourcesDir, package: 'com.example.generated' ) { schema(dir: 'src/main/resources/xsd', includes: '*.xsd') arg(value: "-encoding") arg(value: "UTF-8") } } } compileJava.dependsOn xjcGenerate compileJava.options.encoding = 'UTF-8'
XSD元素示例
<xs:complexType name="ОткрытиеСчетов">
反序列化错误信息
jakarta.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
解决方法
调整Gradle配置后排查发现,问题根源在于XML文件的编码格式:UTF-8与UTF-8-BOM的差异。将XML文件的编码改为无BOM的UTF-8格式后,反序列化恢复正常。
内容的提问来源于stack exchange,提问作者Roman Tataev
相关产品推荐
相关产品推荐

