使用XJC(JAXB)从XSD生成Java对象时遭遇Property 'Value'重复定义错误的求助
解决JAXB XJC生成Java类时的"Property 'Value' is already defined"冲突问题
我来帮你搞定这个困扰你的JAXB属性冲突问题!先理清错误根源,再纠正你绑定文件里的问题,最后给出可行的解决方案。
错误原因分析
你的DocumentExtensionType同时包含了两个JAXB默认会生成同名属性的节点:
<xsd:any namespace="##local" processContents="lax" maxOccurs="unbounded"/>:这是可重复的本地元素节点,JAXB默认会为它生成名为Value的属性<xsd:anyAttribute processContents="lax"/>:这是任意属性节点,JAXB默认也会为它生成名为Value的属性
两个节点用同一个属性名,自然触发了重复定义的错误。
你之前绑定文件的问题
第一个绑定文件的问题
- 节点路径错误:你的XSD里
DocumentExtensionType的sequence下直接是<xsd:any>,没有<xsd:choice>节点,但绑定路径里写了xsd:choice,导致XJC找不到目标节点,配置无效 - namespace匹配错误:绑定的是
http://checklists.nist.gov/sccf/0.1,但XSD里的any节点是##local,完全不匹配
第二个绑定文件的问题
- namespace匹配错误:XSD里的any节点namespace是
##local,你绑定的是@namespace='',匹配不到目标节点 - 未处理
anyAttribute的冲突:只尝试修改了元素any的属性名,忽略了同样会生成Value属性的anyAttribute,冲突依然存在
正确的绑定文件配置
你需要同时给<xsd:any>和<xsd:anyAttribute>指定不同的属性名,彻底避免冲突。以下是修正后的绑定文件(命名为foo.xjb):
<?xml version="1.0" encoding="UTF-8"?> <jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <jxb:bindings schemaLocation="foo.xsd"> <!-- 给xsd:any元素指定自定义属性名 --> <jxb:bindings node="//xsd:complexType[@name='DocumentExtensionType']/xsd:sequence/xsd:any[@namespace='##local']"> <jxb:property name="localExtensionElements"/> </jxb:bindings> <!-- 给xsd:anyAttribute指定自定义属性名 --> <jxb:bindings node="//xsd:complexType[@name='DocumentExtensionType']/xsd:anyAttribute"> <jxb:property name="localExtensionAttributes"/> </jxb:bindings> </jxb:bindings> </jxb:bindings>
执行命令验证
保持你原来的xjc命令不变,确保绑定文件和XSD文件在同一目录下(或指定正确路径):
xjc -p "com.track.doc" -d "/Users/batman/Downloads/XSD" -b foo.xjb foo.xsd
执行成功后,生成的DocumentExtensionType.java类里会有:
getLocalExtensionElements()和setLocalExtensionElements()方法对应原来的<xsd:any>节点getLocalExtensionAttributes()和相关属性操作方法对应原来的<xsd:anyAttribute>节点
这样就彻底解决了属性名重复的冲突问题!
内容的提问来源于stack exchange,提问作者BATMAN_2008
相关产品推荐
相关产品推荐

