JAXB xjc冲突问题:如何用绑定文件解决ProgramLevel与Program->Level冲突?
这个冲突的根源是JAXB的xjc工具在生成ObjectFactory类时,会根据元素名称自动生成工厂方法,而<ProgramLevel>元素和<Program>嵌套的<Level>元素,默认生成的方法签名或类名出现了重复,导致ObjectFactory里的声明冲突。
要解决这个问题,你可以通过**JAXB绑定文件(binding.xml)**来自定义生成的类名或工厂方法名,避免命名碰撞。下面是具体的实现步骤:
步骤1:创建绑定文件
创建一个名为binding.xml的文件,内容如下:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.1"> <!-- 关联你的目标XSD文件 --> <jaxb:bindings schemaLocation="sample.xsd"> <!-- 使用XPath定位到Program下的Level元素 --> <jaxb:bindings node="//xsd:element[@name='Program']/xsd:complexType/xsd:sequence/xsd:element[@name='Level']"> <!-- 将该元素生成的Java类重命名为ProgramInnerLevel --> <jaxb:class name="ProgramInnerLevel"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
这个绑定文件的作用是:通过XPath精准定位到<Program>内部的<Level>元素,强制将它生成的Java类命名为ProgramInnerLevel,和全局的ProgramLevel类彻底区分开,从根源上避免ObjectFactory的方法冲突。
如果你不想修改类名,也可以只修改工厂方法的名称,替换上面的<jaxb:class>标签为:
<jaxb:factoryMethod name="createProgramInnerLevel"/>
步骤2:使用绑定文件运行xjc命令
在命令行中执行xjc时,通过-b参数指定绑定文件:
xjc -b binding.xml sample.xsd
为什么这能解决问题?
默认情况下,xjc会给<Program>下的<Level>生成名为Level的Java类,同时在ObjectFactory中生成类似createLevel(...)的方法;而<ProgramLevel>元素会生成ProgramLevel类和createProgramLevel(...)方法。由于JAXB的方法生成规则,这两个方法的签名可能出现冲突(比如参数或命名重叠),导致报错。通过绑定文件修改其中一方的命名,就能彻底避免这个碰撞。
内容的提问来源于stack exchange,提问作者Abhishek Mukherjee

