JAXB生成类时如何修改元素名称?解决重复字段报错
解决XJC生成类时"trying to create the same field twice: xxx"错误
你说得对,这个问题确实是因为Schema里的<xs:element name="XXX"/>和<xs:attribute name="xxx"/>在XJC生成Java类时,会被处理成同名的字段(Java字段名默认不区分大小写,XJC内部会统一处理命名逻辑),导致冲突。下面是具体的解决方案,用绑定文件重命名其中一个元素/属性:
步骤1:创建绑定文件schemat_binding.xml
创建一个XML文件,内容如下,我们把元素XXX重命名为xxxElement(你可以改成任何不冲突的名称):
<?xml version="1.0" encoding="UTF-8"?> <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0"> <!-- 指定要绑定的Schema文件路径 --> <jaxb:bindings schemaLocation="mySchema.xsd"> <!-- 定位到名为"a"的complexType --> <jaxb:bindings node="//xs:complexType[@name='a']"> <!-- 定位到该complexType下的元素XXX --> <jaxb:bindings node=".//xs:element[@name='XXX']"> <!-- 重命名生成的Java属性为xxxElement --> <jaxb:property name="xxxElement"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
关键部分解释:
schemaLocation:填写你的mySchema.xsd的路径,如果和绑定文件同目录,直接写文件名即可。node="//xs:complexType[@name='a']":用XPath定位到Schema里定义的a复杂类型。node=".//xs:element[@name='XXX']":在a类型下精准找到名为XXX的元素。<jaxb:property name="xxxElement"/>:指定生成的Java属性名,彻底避免和属性xxx的字段冲突。
步骤2:用绑定文件执行XJC命令
修改原来的命令,加上-b参数指定绑定文件:
"%java_home%\bin\xjc" -b schemat_binding.xml mySchema.xsd
执行这个命令后,XJC会按照绑定文件的规则生成类,元素XXX会被映射为xxxElement字段,和属性xxx的字段就不会再冲突了。
可选方案:重命名属性而非元素
如果你更想保留元素XXX的名称,也可以选择重命名属性xxx,只需要把绑定文件里的XPath改成定位属性,比如:
<jaxb:bindings node="//xs:complexType[@name='a']"> <!-- 定位到该complexType下的属性xxx --> <jaxb:bindings node=".//xs:attribute[@name='xxx']"> <!-- 重命名生成的Java属性为attrXxx --> <jaxb:property name="attrXxx"/> </jaxb:bindings> </jaxb:bindings>
这样生成的类里,属性xxx会变成attrXxx字段,同样能解决冲突问题。
内容的提问来源于stack exchange,提问作者UserASD
相关产品推荐
相关产品推荐

