gpt4 book ai didi

java - Java/CXF/SOAP 应用程序中的继承问题?

转载 作者:行者123 更新时间:2023-11-29 09:21:20 25 4
gpt4 key购买 nike

我正在开发一个使用 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>

当使用 wsdl2java 生成 java 代码时,一切正常,我什至可以看到生成的 Child(A|B) 类的扩展。

但是,如果我实现一个方法,将父类型的元素作为输入参数

<xsd:element name="methodInput">
<xsd:complexType>
<xsd:sequence >
<xsd:element name="input" type="tns:Parent"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

当我使用以下调用从客户端(使用 cxf 生成的 javascript)调用方法时(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>

一切正常。

所以我想知道是否可以使用 Parent 类作为输入参数。如果可能的话,为了使这项工作我还缺少什么。

谢谢。

编辑:

我没能完全按照我想要的那样工作,但我想出了一个办法。我只是使用了 xml 模式的一些其他选项。其中两个似乎取决于上下文。

首先使用选择(针对几个 child ):

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

但是这个似乎要求在服务器端多一点代码。

附言:<xsd:element name="methodInput" type="anyType" />似乎在客户端产生错误消息,这就是我使用序列的原因。

最佳答案

我认为 javascript 客户端根本不支持类型继承。它有很多限制。补丁将受到欢迎。 :-)

特别是,需要更新 javascript 以输出 xsi:type="ns:Child1"属性,以便 JAXB 可以正确映射它。

关于java - Java/CXF/SOAP 应用程序中的继承问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6187447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com