JAXB xjc:两个声明导致冲突

时间:2019-01-30 12:27:00

标签: binding xsd jaxb schema xjc

我在here主题上找到了类似的讨论。但是那里的情况与此完全不同,该解决方案对我不起作用。所以我再次提出这个问题。

我的XSD (sample.xsd)

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="field">
      <xsd:complexType>
         <xsd:choice maxOccurs="unbounded" minOccurs="0">
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="ProgramLevel">
               <xsd:complexType>
                  <xsd:attribute name="value" type="xsd:string" use="optional"/>
                  <xsd:attribute name="desc" type="xsd:string" use="optional"/>
               </xsd:complexType>
            </xsd:element>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="Program">
               <xsd:complexType>
                  <xsd:sequence maxOccurs="unbounded" minOccurs="0">
                     <xsd:element maxOccurs="unbounded" minOccurs="0" name="Level">
                        <xsd:complexType>
                           <xsd:attribute name="value" type="xsd:string" use="optional"/>
                           <xsd:attribute name="desc" type="xsd:string" use="optional"/>
                        </xsd:complexType>
                     </xsd:element>
                  </xsd:sequence>
               </xsd:complexType>
            </xsd:element>
         </xsd:choice>
      </xsd:complexType>
    </xsd:element>
</xsd:schema>

我的XML

<field>
    <ProgramLevel value="x" />
</field>
<field>
    <Program>
        <Level value="y" />
    </Program>
</field>

在运行xjc命令时出现以下错误

[ERROR] Two declarations cause a collision in the ObjectFactory class.
  line 7 of file:/D:/ProgramPractice/CreateXSD/JAXB/sample.xsd

[ERROR] (Related to above error) This is the other declaration.
  line 16 of file:/D:/ProgramPractice/CreateXSD/JAXB/sample.xsd

Failed to produce code.

有人知道如何借助绑定文件解决'ProgramLevel''Program->Level'之间的冲突吗?预先感谢。

3 个答案:

答案 0 :(得分:0)

这很简单。 您正在choice元素类型的定义中使用field作曲家。 但是choice意味着在其中包含的所有粒子中,目标XML中可能仅出现一个。因此,根据您的sample.xsd模式,<ProgramLevel><Program>可能不会同时显示为<field>元素的子元素。 只能使用其中之一!

如果两者都需要,则应改用xsd:sequence作曲家,并按如下所示修改架构:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="field">
    <xsd:complexType>
       <xsd:sequence maxOccurs="unbounded" minOccurs="0">
       ...
       </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

然后,您的XML将通过验证(没有冲突)。

  

请注意,xsd:sequence作曲家也有其限制。这意味着其中指定的粒子应严格按照与XML模式中相同的顺序出现在目标XML中。也就是说,以下内容也将是错误的:<field><Program>...</Program><ProgramLevel/></field>。因此,如果需要,您应该相应地修改架构。但是,如果根本不限制顺序,请使用all作曲家(或更复杂的结构)。

P.S。 对于使用XML模式和WSDL的人来说,以下链接可能很有趣:

如果您重视我对本网站的参与,请不要删除这些链接!

答案 1 :(得分:0)

通过在绑定文件中添加以下内容,最终解决了该问题:

FormsAuthentication.SetAuthCookie("TESTER", true);

答案 2 :(得分:0)

我通过在 jaxb 插件配置中添加 XautoNameResolution 作为参数解决了这个问题。

 <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.14.0</version>
            <executions>
                <execution>
                    <id>schema2</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <args>
                            <arg>-XautoNameResolution</arg>
                        </args>
                        <schemaLanguage>WSDL</schemaLanguage>
                        <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
                        <schemaIncludes>
                            <include>products.wsdl</include>
                        </schemaIncludes>
                        <generatePackage>com.suhas.generated</generatePackage>
                        <generateDirectory>${project.basedir}/src/main/java</generateDirectory>
                        <cleanPackageDirectories>true</cleanPackageDirectories>
                    </configuration>
                </execution>
            </executions>
        </plugin>