如果已经创建,则从解组中排除xsd元素?

时间:2015-07-09 10:40:59

标签: java xsd unmarshalling maven-jaxb2-plugin

使用jaxb(maven-jaxb2-plugin)编译器进行maven构建时出现以下错误

A class/interface with the same name "org.somePackage.customer" is already in use.
    Use a class customization to resolve this conflict.
        at com.sun.tools.xjc.util.CodeModelClassFactory.createClass(CodeModelClassFactory.java:121)
        at com.sun.tools.xjc.util.CodeModelClassFactory.createClass(CodeModelClassFactory.java:82)
        at com.sun.tools.xjc.generator.bean.ImplStructureStrategy$1.createClasses(ImplStructureStrategy.java:82)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.generateClassDef(BeanGenerator.java:437)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.getClazz(BeanGenerator.java:469)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:194)
        at com.sun.tools.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:166)
        at com.sun.tools.xjc.model.Model.generateCode(Model.java:290)
        at org.jvnet.mjiip.v_2_2.XJC22Mojo.generateCode(XJC22Mojo.java:70)

相关的XSD代码段,因为它将会出现错误

 <xsd:element name="customer" >
         ........
 </xsd:element>
 <xsd:element name="permanentCustomer" type="customer"/>

maven-jaxb2-plugin的相关pom部分是

    <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.8.3</version>
            <configuration>
                <schemaDirectory>src/main/resources/META-INF/schema</schemaDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

什么有用

如果我介绍block="substitution",则可以使用

<xsd:element name="customer" block="substitution">
 ........
</xsd:element>
<xsd:element name="permanentCustomer" type="customer"/>

在对网络进行研究之后,我的猜测是jaxb编译器再次尝试基于元素name="permanentCustomer"创建客户类,它已经基于元素name ="customer".创建了所以我不想创建解组时对象为永久客户的java对象,因为它已在客户创建时创建。

我能想到两个解决方案

1)一些配置对于maven-jaxb2-plugin插件,如果已生成java类,则不要再次重新生成它并继续

2)或者在xml级别提到一些属性来忽略特定元素?

是否存在任何配置?

1 个答案:

答案 0 :(得分:0)

这是一个问题,并非特定于我( diclaimer )恰好是其作者。

忽略Customer元素的customer类的生成,因为它已经为customer类型生成,这不是一个好主意,因为这些是不同的概念。不要治愈这种症状。

核心问题是XJC尝试尝试为customer元素创建一个类,这会导致命名冲突。因此,要么不生成customer元素的类,要么对命名结合做一些事情。

我不确定为什么XJC会尝试为customer元素创建一个类。通常不应该是这种情况。你可能有一些配置跳进去,不太确定。

解决命名冲突很容易。你可能会做类似的事情:

<jaxb:bindings 
    schemaLocation="..." 
    node="/xs:schema">

    <jaxb:bindings node="xs:element[@name='customer']">
        <jaxb:class name="CustomerElement"/>
    </jaxb:bindings>
</jaxb:bindings>

或者,您可以使用全局自定义进行名称转换,请参阅以下答案:

https://stackoverflow.com/a/21685303/303810

类似的东西: