Pergunta

Ao tentar gerar classes de um XSD, eu tenho esse erro:

java.lang.IllegalArgumentException: Illegal class inheritance loop.  Outer class OrderPropertyList may not subclass from inner class: OrderPropertyList

O meu XSD definir um elemento para agrupar um elemento ilimitada como esta:

  <element minOccurs="0" name="orderPropertyList">
    <complexType>
      <sequence>
        <element maxOccurs="unbounded" name="orderProperty" type="tns:orderProperty" />
      </sequence>
    </complexType>
  </element>

E a ligação meu personalização segue como especificado na esta página , mas Indiferente trabalho. Aqui a minha ligação:

<jaxb:bindings schemaLocation="../xsd/Schema.xsd" node="/xs:schema">
    <jaxb:bindings node="//xs:element[@name='orderPropertyList']">
        <jaxb:class name="OrderPropertyList"/>
    </jaxb:bindings>
</jaxb:bindings>

A minha intenção é gerar uma classe individual para orderPropertyList, não se comportam padrão que está a gerar uma classe interna dentro do elemento raiz do xsd.

Ive assisti alguém com a mesma intenção aqui aqui , mas Indiferente trabalho corretamente para mim. : (

Versão JAXB:

Specification-Version: 2.1
Implementation-Version: 2.1.8

Qualquer ajuda?

Foi útil?

Solução

Eu acredito que o que você precisa está definido:

<jaxb:globalBindings localScoping="toplevel"/>

Isto irá gerar classes independentes em vez de classes aninhadas.

Fazendo

<jaxb:bindings schemaLocation="../xsd/Schema.xsd" node="/xs:schema">
    <jaxb:bindings node="//xs:element[@name='orderPropertyList']">
            <jaxb:class name="OrderPropertyList"/>
    </jaxb:bindings>
</jaxb:bindings>

é uma ligação redundante, uma vez orderPropertyList irá mapear por padrão para OrderPropertyList. O nome do pacote inclui o nome da classe externa que está aninhado em por padrão, então você não está mudando isso.

Além disso, se você queria mudar o nome da classe gerada, acho que o XPath na verdade seria:

<jaxb:bindings node="//xs:element[@name='orderPropertyList']/xs:complexType">

com complexType no final. Eu acho que excluindo este era o que estava causando a mensagem de erro que você tem.

Outras dicas

É muito divertido quando você tem um esquema parecido com o seguinte:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
    <xsd:element name="TopLevelElement">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Something">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="Something" maxOccurs="unbounded">
                                <xsd:complexType>
                                    <xsd:sequence>
                                        <xsd:element name="somethingFieldA" type="xsd:string"/>
                                        <xsd:element name="somethingFieldB" type="xsd:string"/>
                                    </xsd:sequence>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Neste caso, xjc parece estar tentando realmente gerar quatro classes chamados Something, uma para cada elemento chamado Something, e um para cada um dos seus complexTypes. Então, você precisa fornecer uma ligação que atinge cada um destes quatro elementos e tipos complexos nomeadamente ao nível onde eles ocorrem no esquema (bem realmente apenas três, porque então o quarto pode se tornar o Something solitário classe).

Eu acredito que isso está acontecendo porque é provável que a classe Java gerada representando a seqüência de "orderProperty" é em si chamada "OrderPropertyList".

O que eu faria é primeiro gerá-lo sem quaisquer ligações personalizadas, e olhar para os nomes de classes e hierarquias que ele gera. Então, considere o que você deseja substituir, e como.

eu precisava fazer personalizações para um esquema como o jeff303 apresentada. Meu cenário foi um pouco diferente, em que o esquema foi embutido dentro de um documento WSDL.

Uma coisa apontado por philvarner é que o seleção nó para o elemento deve terminar com '/ xs: complexType' e este parecia muito importante, como o compilador continuamente gerar uma IllegalArgumentException relacionadas com looping herança sem ele.

Estas mensagens estão relacionadas então achei um link seria útil para alguém 'pesquisando' que acaba por aqui.

Confira questão 7.881.883

Entrando neste /xs:complexType no final do elemento ajudou na fixação do erro de loop herança de classe ilegal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top