Проблема наследования в приложении Java / CXF / SOAP? - PullRequest
2 голосов
/ 31 мая 2011

Я работаю над приложением, которое использует 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" />, похоже, выдает ошибочное сообщение на стороне клиента, поэтому я использовалпоследовательность.

Ответы [ 2 ]

0 голосов
/ 18 июля 2011

Глядя на сообщение об ошибке, удаление abstract = "true" из Parent могло бы решить проблему.

0 голосов
/ 02 июня 2011

Я не думаю, что клиенты javascript вообще поддерживают наследование типов. Есть множество ограничений на это. Патчи будут приветствоваться. : -)

В частности, необходимо обновить javascript для вывода атрибута xsi: type = "ns: Child1", чтобы JAXB мог правильно отобразить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...