jaxb2-maven-plugin生成Eurofiling 2.0 Schema Java代码时的命名冲突与绑定定制失败问题
jaxb2-maven-plugin生成Eurofiling 2.0 Schema Java代码时的命名冲突与绑定定制失败问题
我来帮你分析并解决这个问题:
问题根源
Eurofiling 2.0的Schema里新增了<element name="NullDimension">,而原有的<element name="null-dimension">会被JAXB默认转换成驼峰式的NullDimension类名/工厂方法名,这就导致了ObjectFactory类里的命名冲突——两个元素最终生成了同名的创建方法和类,触发了Two declarations cause a collision错误。
你尝试用绑定定制来解决,但报错的原因是:你用了<property>标签,但它的适用场景不对。<property>是用来定制复杂类型(complexType)内部元素对应的JavaBean属性名,而不是全局元素的类名或工厂方法名。
正确的绑定定制方案
你需要针对全局元素,用<class>(修改生成的类名)或<factoryMethod>(修改ObjectFactory中的创建方法名)来规避冲突。以下是两种可行的绑定配置:
方案1:重命名新增的NullDimension元素对应的类和工厂方法
创建一个绑定文件(比如src/main/resources/eurofiling-bindings.xjb),内容如下:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:model="http://www.eurofiling.info/eu/fr/xbrl/ext/model" version="2.1"> <jaxb:bindings schemaLocation="http://www.eurofiling.info/eu/fr/xbrl/ext/model.xsd"> <!-- 精准匹配2023年新增的NullDimension元素 --> <jaxb:bindings node="//xs:element[@name='NullDimension' and @model:fromDate='2023-01-01']"> <!-- 修改生成的类名 --> <jaxb:class name="NullDimensionV2"/> <!-- 修改ObjectFactory中的创建方法名 --> <jaxb:factoryMethod name="createNullDimensionV2"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
方案2:重命名旧的null-dimension元素对应的类和工厂方法
如果你想保留新元素的名称,也可以修改旧元素的绑定:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:model="http://www.eurofiling.info/eu/fr/xbrl/ext/model" version="2.1"> <jaxb:bindings schemaLocation="http://www.eurofiling.info/eu/fr/xbrl/ext/model.xsd"> <jaxb:bindings node="//xs:element[@name='null-dimension']"> <jaxb:class name="NullDimensionOriginal"/> <jaxb:factoryMethod name="createNullDimensionOriginal"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
配置jaxb2-maven-plugin加载绑定文件
最后,你需要在maven插件的配置中指定绑定文件的路径,否则插件不会应用你的定制:
<configuration> <sources> <source>...</source> </sources> <locale>en</locale> <!-- 新增绑定文件配置 --> <bindingFiles> <bindingFile>src/main/resources/eurofiling-bindings.xjb</bindingFile> </bindingFiles> </configuration>
这样重新运行插件,命名冲突应该就能解决了。
备注:内容来源于stack exchange,提问作者Prophet
相关产品推荐
相关产品推荐

