使用XJCTask基于cXML.DTD生成Java DTO时JAXB绑定命名空间报错如何解决
问题原因分析
- 绑定文件语法适配错误:你当前编写的绑定规则是面向XML Schema(XSD)的语法,而你要处理的是DTD文件,XJC处理DTD时不识别标准JAXB绑定命名空间,也不支持
xs:schema、xs:complexType这类XSD专属的节点寻址规则,所以触发了命名空间不支持的报错。 - 原始属性冲突原因:cXML DTD的ReturnData节点下同时存在名为
Name的子元素和名为name的属性,XJC默认生成Java属性时会统一转换为驼峰命名,两者都会映射为name属性,因此触发重名冲突。
解决方案
1. 修正绑定文件与Ant配置
首先修改bindings.xjb为DTD适配的绑定语法,启用XJC扩展:
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc"> <jaxb:bindings schemaLocation="cXML.dtd" node="/"> <!-- 定位ReturnData元素下的name属性,重命名避免冲突 --> <xjc:bindings node="//element[@name='ReturnData']//attribute[@name='name']"> <jaxb:property name="returnDataName"/> </xjc:bindings> </jaxb:bindings> </jaxb:bindings>
然后修改Ant的XJCTask配置,添加extension="true"属性启用扩展支持:
<xjc schema="resources/cXML.dtd" binding="resources/bindings.xjb" extension="true" destdir="src/main/java" />
2. 命名空间说明
http://java.sun.com/xml/ns/jaxb 是JAXB的标准命名空间,本身没有失效,只是处理DTD时需要搭配XJC扩展命名空间http://java.sun.com/xml/ns/jaxb/xjc使用,同时打开扩展开关即可正常识别。
非JAXB的DTD生成Java DTO方案
- Castor XML:老牌XML绑定框架,原生支持DTD直接生成Java类,不需要额外转换格式,对老旧DTD兼容性好。
- DTD解析+自定义模板生成:先用DTD解析库读取DTD的结构定义,再通过FreeMarker/Velocity等模板引擎自定义生成DTO,可完全按照业务需求定制生成规则,无框架绑定限制。
- DTD转XSD后生成:先用Trang等工具将cXML DTD转换为标准XSD文件,之后可选用更多生成工具,比如JiBX、XMLBeans,也能更方便地适配高版本JDK的技术栈。
内容的提问来源于stack exchange,提问作者dweloper
相关产品推荐
相关产品推荐

