优化xjc外部绑定XML:解决DaysOfWeek类名冲突问题
解决XJC生成Java类时的DaysOfWeek类名冲突问题
你碰到的这个问题其实是XJC的常见坑:你的XSD里同时存在名为DaysOfWeek的复杂类型(complexType)和同名的全局元素(element),XJC默认会给这两者都生成同名的Java类,自然就撞车了。从你贴的XSD片段来看,复杂类型<xs:complexType name="DaysOfWeek">内部还引用了<xs:element ref="DaysOfWeek"/>,这说明确实有一个全局的<xs:element name="DaysOfWeek">定义,两者重名就触发了冲突。
给你两个可行的解决思路,按需选择:
方案一:用外部绑定文件重命名其中一个类
这是最常用的方法,不用修改原XSD,通过绑定文件告诉XJC给其中一个重命名。比如创建一个binding.xml文件:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1"> <!-- 给全局元素DaysOfWeek指定生成的Java类名 --> <jaxb:bindings schemaLocation="data.xsd"> <jaxb:bindings node="//xs:element[@name='DaysOfWeek']"> <jaxb:class name="DaysOfWeekElement"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
如果想修改复杂类型的类名,把上面的node路径改成//xs:complexType[@name='DaysOfWeek'],然后指定新的类名就行。
然后用xjc命令时带上这个绑定文件:
xjc -b binding.xml data.xsd
这样生成的类就不会重名了。
方案二:修改原XSD的名称(如果允许的话)
如果这个XSD是你自己维护的,直接把复杂类型或者全局元素的名字改得不重复,比如把复杂类型改成DaysOfWeekType,从根源上避免冲突,这样就不用写绑定文件了。
内容的提问来源于stack exchange,提问作者Nikkawat
相关产品推荐
相关产品推荐

