我使用 wsimport 生成了一个 Web 服务客户端。之后,我尝试像这样调用 Web 服务:
public void getUnidade(String username) {
try {
UnidadeEndPointService unidadeEndPointService = new UnidadeEndPointService();
UnidadeEndPoint unidadeEndPointPort = unidadeEndPointService.getUnidadeEndPointPort();
ObjectFactory objectFactory = new ObjectFactory();
ParametroUnidadeDTO parametroUnidadeDTO = objectFactory.createParametroUnidadeDTO();
//set data for parametroUnidadeDTO
UnidadeResponse unidadeResponse = (UnidadeResponse) unidadeEndPointPort.getTemporaryUnit(parametroUnidadeDTO); //this line generates error: java.lang.ClassCastException: com.somepackage.RetornoResponse incompatible with com.somepackage.UnidadeResponse
} catch (WebServiceException e) {
e.printStackTrace();
}
}
我无法理解我收到此 java.lang.ClassCastException 的原因,因为在响应中我似乎收到了 UnidadeResponse,而不是 RetornoResponse:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<rpcOp:getTemporaryUnitResponse
xmlns:rpcOp="http://someaddress.com/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<return
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="UnidadeResponse">
<codRet>0</codRet>
<cdTemporaryUnit>00</cdTemporaryUnit>
<cdTemporaryUpperUnit>00</cdTemporaryUpperUnit>
</return>
</rpcOp:getTemporaryUnitResponse>
</soapenv:Body>
</soapenv:Envelope>
观察:UnidadeResponse 扩展了 RetornoResponse
我需要一个 UnidadeResponse,因为它包含字段 cdTemporaryUpperUnit 而 RetornoResponse 不包含它。你知道为什么我得到错误的对象类型吗?
RetornoResponse.java
//
// Generated By:JAX-WS RI 2.2.4-b01 (JAXB RI IBM 2.2.4-2)
//
package somepackage;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for retornoResponse complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="retornoResponse">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="codRet" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="msgRet" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "retornoResponse", propOrder = {
"codRet",
"msgRet"
})
public class RetornoResponse {
protected String codRet;
protected String msgRet;
/**
* Gets the value of the codRet property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCodRet() {
return codRet;
}
/**
* Sets the value of the codRet property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCodRet(String value) {
this.codRet = value;
}
/**
* Gets the value of the msgRet property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getMsgRet() {
return msgRet;
}
/**
* Sets the value of the msgRet property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setMsgRet(String value) {
this.msgRet = value;
}
}
UnidadeResponse.java
//
// Generated By:JAX-WS RI 2.2.4-b01 (JAXB RI IBM 2.2.4-2)
//
package somepackage;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for UnidadeResponse complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="UnidadeResponse">
* <complexContent>
* <extension base="{http://someaddress/}retornoResponse">
* <sequence>
* <element name="cdTemporaryUnit" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="cdTemporaryUpperUnit" type="{http://www.w3.org/2001/XMLSchema}string"/>
* </sequence>
* </extension>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "UnidadeResponse", propOrder = {
"cdTemporaryUnit",
"cdTemporaryUpperUnit"
})
public class UnidadeResponse
extends RetornoResponse
{
@XmlElement(required = true)
protected String cdTemporaryUnit;
@XmlElement(required = true)
protected String cdTemporaryUpperUnit;
/**
* Gets the value of the cdTemporaryUnit property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCdTemporaryUnit() {
return cdTemporaryUnit;
}
/**
* Sets the value of the cdTemporaryUnit property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCdTemporaryUnit(String value) {
this.cdTemporaryUnit = value;
}
/**
* Gets the value of the cdTemporaryUpperUnit property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getCdTemporaryUpperUnit() {
return cdTemporaryUpperUnit;
}
/**
* Sets the value of the cdTemporaryUpperUnit property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setCdTemporaryUpperUnit(String value) {
this.cdTemporaryUpperUnit = value;
}
}
WSDL
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:tns="http://someaddress/" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" name="UnidadeEndPointService" targetNamespace="http://someaddress/">
<types>
<xsd:schema>
<xsd:import namespace="http://someaddress/" schemaLocation="UnidadeEndPointService_schema1.xsd"/>
</xsd:schema>
</types>
<message name="getTemporaryUnit">
<part name="ParametroUsuarioDTO" type="tns:parametroUnidadeDTO"> </part>
</message>
<message name="WebServiceException">
<part name="fault" element="tns:WebServiceException"> </part>
</message>
<message name="getTemporaryUnitResponse">
<part name="return" type="tns:retornoResponse"> </part>
</message>
<portType name="UnidadeEndPoint">
<operation name="getTemporaryUnit">
<input message="tns:getTemporaryUnit" wsam:Action="http://someaddress/UnidadeEndPoint/getTemporaryUnitRequest"> </input>
<output message="tns:getTemporaryUnitResponse" wsam:Action="http://someaddress/UnidadeEndPoint/getTemporaryUnitResponse"> </output>
<fault name="WebServiceException" message="tns:WebServiceException" wsam:Action="http://someaddress/UnidadeEndPoint/getTemporaryUnit/Fault/WebServiceException"> </fault>
</operation>
</portType>
<binding name="UnidadeEndPointPortBinding" type="tns:UnidadeEndPoint">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getTemporaryUnit">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal" namespace="http://someaddress/"/>
</input>
<output>
<soap:body use="literal" namespace="http://someaddress/"/>
</output>
<fault name="WebServiceException">
<soap:fault name="WebServiceException" use="literal"/>
</fault>
</operation>
</binding>
<service name="UnidadeEndPointService">
<port name="UnidadeEndPointPort" binding="tns:UnidadeEndPointPortBinding">
<soap:address location="http://someanotherddress/UnidadeEndPointService"/>
</port>
</service>
</definitions>
XSD
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://someaddress/" version="1.0" targetNamespace="http://someaddress/">
<xs:element name="WebServiceException" nillable="true" type="tns:faultInfo"/>
<xs:complexType name="parametroUnidadeDTO">
<xs:complexContent>
<xs:extension base="tns:cpaBaseDto">
<xs:sequence>
<xs:element name="codigoLocalMatricula" type="xs:string"/>
<xs:element name="tipo" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="cpaBaseDto">
<xs:sequence>
<xs:element name="operacao" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="UsuarioDTO">
<xs:complexContent>
<xs:extension base="tns:cpaBaseDto">
<xs:sequence>
<xs:element name="codigoLocalMatricula" type="xs:string"/>
<xs:element name="tipo" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="UnidadeDTO">
<xs:complexContent>
<xs:extension base="tns:cpaBaseDto">
<xs:sequence>
<xs:element name="codigoLocalMatricula" type="xs:string"/>
<xs:element name="tipo" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="retornoResponse">
<xs:sequence>
<xs:element name="codRet" type="xs:string" minOccurs="0"/>
<xs:element name="msgRet" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="UsuarioResponse">
<xs:complexContent>
<xs:extension base="tns:retornoResponse">
<xs:sequence>
<xs:element name="cdTemporaryPosition" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="UnidadeResponse">
<xs:complexContent>
<xs:extension base="tns:retornoResponse">
<xs:sequence>
<xs:element name="cdTemporaryUnit" type="xs:string"/>
<xs:element name="cdTemporaryUpperUnit" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="faultInfo">
<xs:sequence>
<xs:element name="code" type="xs:int" minOccurs="0"/>
<xs:element name="message" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
谢谢你。
更新/解决方案:
我基于 wsimport 生成的类创建了上面的所有代码。我尝试使用 Axis 生成代码,但同样的问题。因此,我与 Web 服务的所有者交谈,他做了一些调整,现在它正在工作。我注意到例如在 WSDL 中更改了返回类型:
<message name="getTemporaryUnitResponse">
<part name="return" type="tns:UnidadeResponse"> </part>
</message>
基本上这是 Web 服务端的错误。