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;
}
"Accepted" と "Rejected" は 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で実行すると、エラーが発生します
エラー: XmlElementRef が存在しないクラスを指しています。
問題が「承認済み」と「拒否済み」であることはわかっていますが、どうすれば解決できますか? これらの要素名をサポートするクラスが必要ですか? たとえば、次のようなクラスを作成するとします。
@XmlRootElement(name="Accepted")
public class Accepted extends ResponseType { }
schemagen はそれを受け入れます。しかし、なぜその実装が必要なのですか?