1

我使用 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>
 * &lt;complexType name="retornoResponse">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="codRet" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="msgRet" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/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>
 * &lt;complexType name="UnidadeResponse">
 *   &lt;complexContent>
 *     &lt;extension base="{http://someaddress/}retornoResponse">
 *       &lt;sequence>
 *         &lt;element name="cdTemporaryUnit" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         &lt;element name="cdTemporaryUpperUnit" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *       &lt;/sequence>
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/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 服务端的错误。

4

0 回答 0