Проблема создания схемы с использованием @XmlElementRef - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь продублировать немного схемы, начиная с Java и используя schemagen (длинная история).Схема выглядит следующим образом:

<xsd:element name="Responses">
   <xsd:complexType>
      <xsd:choice maxOccurs="unbounded">
         <xsd:element ref="tns:Accepted"/>
         <xsd:element ref="tns:Rejected"/>
         <xsd:element ref="oth:Exception"/>
      </xsd:choice>
   </xsd:complexType>
</xsd:element>

<xsd:element name="Accepted" type="tns:ResponseType"/>
<xsd:element name="Rejected" type="tns:ResponseType"/>

<xsd:complexType name="ResponseType">
   <xsd:sequence>
     <xsd:element name="Id" type="xsd:anyURI"/>
     <!-- more valid elements -->
  </xsd:sequence>
</xsd:complexType>

Я создал следующий класс для ее представления:

@XmlRootElement(name="Responses")
public class Responses {

    @XmlElementRefs(value = {
            @XmlElementRef(name="Accepted", namespace="http://sample.net", type=ResponseType.class),
            @XmlElementRef(name="Rejected", namespace="http://sample.net", type=ResponseType.class),
            @XmlElementRef(name="Exception", namespace="http://other.net", type=ExceptionType.class)
    })
    public List<JAXBElement<Object>> response;
}

«Принятые» и «Отклоненные» определены только в ObjectFactory и не имеют классаподдержка имени:

@XmlElementDecl(namespace = "http://sample.net", name = "Accepted")
public JAXBElement<ResponseType> createAccepted(ResponseType value) {
    return new JAXBElement<ResponseType>(_Accepted_QNAME, ResponseType.class, null, value);
}

Когда я запускаю их через schemagen, я получаю ошибку

error: XmlElementRef указывает на несуществующий класс.

Я знаю, что проблема с «Принят» и «Отклонено», но как мне решить эту проблему?НУЖНЫ ли классы, поддерживающие эти имена элементов?Например, если я создаю такой класс:

@XmlRootElement(name="Accepted")
public class Accepted extends ResponseType { }

schemagen принимает его.Но зачем мне эта реализация?

1 Ответ

0 голосов
/ 06 апреля 2011

Да, вам нужно определить тип ResponseType.

примерно так:

<xs:complexType name="ResponseType">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="name" type="xs:string"/>
        <xs:any namespace="##other" processContents="lax"/>
    </xs:choice>
</xs:complexType>

ваши последние элементы будут выглядеть так: некоторая строка некоторая строка

или

<xs:simpleType name="ResponseType">
    <xs:restriction base="xs:string"/>
</xs:simpleType>

будет иметь некоторую строку

...