我身上发生了一些奇怪的大脑。 在给定的xsd文件中,我们找到一个xml元素,如下所示:
<xsd:element name="getAllOperationsSystemsRequest">
<xsd:annotation>
<xsd:documentation>
</xsd:documentation>
</xsd:annotation>
</xsd:element>
并且wsdl操作链接到元素
<wsdl:operation name="getAllOperationsSystems">
<wsdl:input message="tns:getAllOperationsSystemsRequest"/>
<wsdl:output message="tns:getAllOperationsSystemsResponse"/>
<wsdl:fault name="getAllOperationsSystemsException" message="tns:getAllOperationsSystemsException"/>
</wsdl:operation>
显然,getAllOperationsSystemsRequest未绑定到任何已知类型(缺少属性“type”)。 结果,在我们执行了wsdl2java工具之后,我们最终获得了一个方法定义:
public org.tmforum.mtop.mri.xsd.osr.v1.MultipleObjectsResponseType getAllOperationsSystems(
javax.xml.ws.Holder<org.tmforum.mtop.fmw.xsd.hdr.v1.Header> mtopHeader,
java.lang.**Object** mtopBody
)throws GetAllOperationsSystemsException
生成一个Object而不是OperationsSystemsRequest作为输入参数类型,(实际上OperationsSystemsRequest永远不会存在。
最后,我们在marshall / unmarshall中得到一个粗体运行时错误
引起:com.sun.istack.SAXException2:“javax.xml.bind.JAXBElement”的实例代替“java.lang.Object”,但“javax.xml.bind.JAXBElement”被绑定匿名类型。
我非常感谢任何人提供解决方案的信息。 Tnanks提前。
答案 0 :(得分:0)
根据XML Schema规范,getAllOperationsSystemsRequest元素的“type”是xsd:anyType。基本上,任何事情。这就是代码中生成Object的原因。代码生成器为类型生成,而不是元素(主要是)。如果类型仅在元素中表示,那么它将获得@XmlRootElement注释,但在大多数情况下,您必须考虑类型。
我建议将架构更改为:
<xsd:element name="getAllOperationsSystemsRequest">
<xsd:annotation>
<xsd:documentation>
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence/>
</xsd:complexType>
</xsd:element>
这应该生成一个类型并将元素限制为一个空元素。