Я работаю над приложением, которое использует cxf, основой приложения является файл wsdl, и у меня возникают некоторые проблемы при работе с наследованием.
Я попытаюсь привести наглядный пример(не совсем то, над чем я работаю, но это должно подытожить идею).В определении типа у меня есть следующее
<xsd:complexType name="Parent" abstract="true">
</xsd:complexType>
<xsd:complexType name="ChildA">
<xsd:complexContent>
<xsd:extension base="tns:Parent">
<xsd:sequence>
<xsd:element name="attr1" type="xsd:double"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="ChildB">
<xsd:complexContent>
<xsd:extension base="tns:Parent">
<xsd:sequence>
<xsd:element name="attr2" type="xsd:double"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Когда Java-код генерируется с использованием wsdl2java, все работает нормально, я даже вижу расширения на сгенерированных дочерних (A | B) классах.
Однако, если я реализую метод, который принимает в качестве входного параметра элемент типа Parent
<xsd:element name="methodInput">
<xsd:complexType>
<xsd:sequence >
<xsd:element name="input" type="tns:Parent"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
, когда я вызываю метод со стороны клиента (используя javascript, сгенерированный cxf)с помощью следующего (RemoteControl - это объект, обрабатывающий обмен SOAP на стороне клиента):
var childA=new __childA();
childA.setAttr1(100);
RemoteControl.method(childA);
На стороне Java у меня есть следующая ошибка (...
для замены точных строк, которыевсе связаны либо с cxf, либо с sun.xml):
org.apache.cxf.interceptor.Fault: Unmarshalling Error: Unable to create an instance of Parent
...
Caused by: javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.bind.UnmarshalException: Unable to create an instance of Parent
- with linked exception:
[java.lang.InstantiationException]]
...
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of Parent
- with linked exception:
[java.lang.InstantiationException]
...
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of Parent
- with linked exception:
[java.lang.InstantiationException]
...
Caused by: java.lang.InstantiationException
...
Однако, если объявление входного параметра
<xsd:element name="methodInput">
<xsd:complexType>
<xsd:sequence >
<xsd:element name="input" type="tns:childA"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Все работает нормально.
Так что мне интересно, возможно ли использовать родительский класс в качестве входного параметра.И если это возможно, то, что мне не хватает, чтобы заставить это работать.
Спасибо.
Редактировать:
Я не сделалудалось заставить это работать так, как я хотел, но я нашел способ обойти.Я просто использовал некоторые другие параметры схемы XML.Кажется, что два из них работают в зависимости от контекста.
Во-первых, используя варианты (для нескольких детей):
<xsd:element name="methodInput">
<xsd:complexType>
<xsd:choice >
<xsd:element name="inputA" type="tns:childA"/>
<xsd:element name="inputB" type="tns:childB"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
Во-вторых, используя любой элемент (когда существует множество вариантов)
<xsd:element name="methodInput">
<xsd:complexType>
<xsd:sequence >
<xsd:any/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Но этот, похоже, требует немного больше кода на стороне сервера.
PS: <xsd:element name="methodInput" type="anyType" />
, похоже, выдает ошибочное сообщение на стороне клиента, поэтому я использовалпоследовательность.