문제

XSD에서 클래스를 생성하려고하는 동안이 오류가 발생했습니다.

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

내 XSD는 다음과 같은 무한한 요소를 그룹화 할 요소를 정의합니다.

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

그리고 내 사용자 정의 바인딩은 지정된대로 따릅니다 이 페이지, 그러나 작동하지 않습니다. 여기 내 바인딩 :

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

저의 의도는 XSD의 루트 요소 내부에서 내부 클래스를 생성하는 기본 동작이 아니라 OrderPropertylist에 대한 개별 클래스를 생성하는 것입니다.

나는 같은 의도를 가진 사람을 보았다 여기 그리고 여기, 그러나 그것은 나를 위해 제대로 작동하지 않습니다. :(

JAXB 버전 :

Specification-Version: 2.1
Implementation-Version: 2.1.8

도움이 있습니까?

도움이 되었습니까?

해결책

나는 당신이해야 할 일이 설정되었다고 생각합니다.

<jaxb:globalBindings localScoping="toplevel"/>

이것은 중첩 클래스 대신 독립형 클래스를 생성합니다.

행위

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

OrderPropertyList는 OrderPropertyList에 기본적으로 매핑되므로 중복 결합입니다. 패키지의 이름에는 기본적으로 중첩 된 외부 클래스 이름이 포함되어 있으므로 변경하지 않습니다.

또한 생성 된 클래스의 이름을 변경하려면 XPath가 실제로 다음과 같습니다.

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

끝에 복합 유형이 있습니다. 나는 이것을 배제하는 것이 당신이 얻은 오류 메시지를 일으킨 원인이라고 생각합니다.

다른 팁

다음과 같은 스키마가 있으면 정말 재미 있습니다.

<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>

이 경우 XJC는 실제로 4 개의 클래스를 생성하려고하는 것 같습니다. Something, 각 요소마다 하나가 명명되었습니다 Something, 각각 하나 complexType에스. 따라서이 네 가지 요소 각각에 맞는 바인딩을 제공해야합니다. 그리고 스키마에서 발생하는 수준에서 특별히 복잡한 유형 (실제로 3 개에 불과합니다. Something 수업).

"OrderProperty"의 시퀀스를 나타내는 생성 된 Java 클래스가 그 자체가 "OrderPropertyList"라고 할 가능성이 있기 때문에 이것이 일어나고 있다고 생각합니다.

내가 할 일은 먼저 사용자 정의 바인딩없이 생성하고 생성하는 클래스 이름과 계층을 보는 것입니다. 그런 다음 재정의하고 싶은 것을 고려하십시오.

스키마와 같은 스키마를 사용자 정의해야했습니다. Jeff303 발표. 내 시나리오는 스키마가 WSDL 문서 내에서 상환되었다는 점에서 약간 달랐습니다.

한 가지가 지적되었습니다 필바르너 그게 요소의 노드 선택은 '/xs : complextype'로 끝나야합니다. 그리고 컴파일러가 반복 상속과 관련된 불법적 인 소속을 지속적으로 생성 할 것이기 때문에 이것은 매우 중요해 보였습니다.

이 게시물은 관련이 있으므로 링크가 여기에서 끝나는 'Googling'에게 도움이 될 것이라고 생각했습니다.

질문을 확인하십시오 7881883

이것에 들어갑니다 /xs:complexType 요소가 끝나면 불법 클래스 상속 루프 오류를 해결하는 데 도움이되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top