使用JAXB XJC生成Java类时如何解决XSD属性冲突?
解决XSD生成Java类时的"Lang"属性冲突问题
问题原因
xhtml1-strict.xsd中同时定义了xml:lang属性和lang属性,JAXB默认会将这两个属性映射为同名的Java属性Lang,导致命名冲突,触发Property "Lang" is already defined错误。
修复方案
通过JAXB绑定文件(.xjb)给冲突的其中一个属性重命名,避免名称重复。具体操作如下:
1. 修改绑定文件
更新你的cwe-bindings.xjb文件,精准定位xhtml schema中的冲突属性,将其中一个重命名(比如把lang属性改为HtmlLang):
<!-- cti-domain/src/main/xjb/cwe-bindings.xjb --> <jxb:bindings version="1.0" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 绑定CWE schema到指定包 --> <jxb:bindings schemaLocation="../../../../_schema_/cwe/cwe_schema_v6.10.xsd" node="//xsd:schema"> <jxb:schemaBindings> <jxb:package name="com.example.cwe"/> </jxb:schemaBindings> </jxb:bindings> <!-- 处理xhtml schema中的Lang属性冲突 --> <jxb:bindings schemaLocation="http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd" node="//xsd:schema"> <!-- 定位到lang属性,重命名为HtmlLang --> <jxb:bindings node="//xsd:attribute[@name='lang']"> <jxb:property name="HtmlLang"/> </jxb:bindings> </jxb:bindings> </jxb:bindings>
2. 关键说明
- 精准定位属性:用
//xsd:attribute[@name='lang']找到xhtml schema中定义的lang属性,而非xml:lang(后者对应XML标准属性,默认映射为XmlLang) - 重命名属性:通过
jxb:property将该属性的Java名称改为不冲突的名字(比如HtmlLang)
3. 验证配置
确保jaxb2-maven-plugin的xjbSources路径正确指向包含绑定文件的目录,插件会自动读取该目录下的所有.xjb文件。
4. 重新生成类
运行Maven命令重新生成Java类:
mvn jaxb2:xjc
额外提示
如果本地存储了xhtml1-strict.xsd文件,可将schemaLocation改为本地路径,避免构建时远程拉取,提升稳定性。
内容的提问来源于stack exchange,提问作者1Z10
相关产品推荐
相关产品推荐

