0

我正在尝试通过使用 xs:choice 来实现 SOAP 服务,但是我过得很糟糕。

首先,我编写了一个 xml 模式,而不是使用 xcj 生成了我的类,但是尽管我认为响应是正确的,但该服务并未验证我的响应。

好的,首先是 WSDL:

 <?xml version='1.0' encoding='UTF-8'?>
<definitions targetNamespace="http://ofelia/" name="agrupaServiceWS" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ofelia/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://ofelia/" schemaLocation="agrupaServiceWS_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="diz">
    <part name="parameters" element="tns:diz"/>
  </message>
  <message name="dizResponse">
    <part name="parameters" element="tns:dizResponse"/>
  </message>
  <message name="dizPosi">
    <part name="parameters" element="tns:dizPosi"/>
  </message>
  <message name="dizPosiResponse">
    <part name="parameters" element="tns:dizPosiResponse"/>
  </message>
  <portType name="agrupa">
    <operation name="diz">
      <input message="tns:diz"/>
      <output message="tns:dizResponse"/>
    </operation>
    <operation name="dizPosi">
      <input message="tns:dizPosi"/>
      <output message="tns:dizPosiResponse"/>
    </operation>
  </portType>
  <binding name="agrupaPortBinding" type="tns:agrupa">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="diz">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="dizPosi">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="agrupaServiceWS">
    <port name="agrupaPort" binding="tns:agrupaPortBinding">
      <soap:address location="http://localhost:7101/ofelia/agrupaServiceWS"/>
    </port>
  </service>
</definitions>

WSDL 使用的 xml 模式:

<?xml version='1.0' encoding='UTF-8'?>
<xs:schema version="1.0" targetNamespace="http://ofelia/" xmlns:tns="http://ofelia/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Data">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element ref="tns:POSI"/>
          <xs:element ref="tns:TESTE"/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Header">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="State" type="xs:string"/>
        <xs:element name="TypeReq" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="OauthToken">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="AuthToken" type="xs:string"/>
        <xs:element name="TokenSecret" type="xs:string"/>
        <xs:element name="ExpireDate" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="OfeliaDataEx">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Header">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="State" type="xs:string"/>
              <xs:element name="TypeReq" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="User">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="JabberID" type="xs:string"/>
              <xs:element name="OpenID" type="xs:anyURI"/>
              <xs:element name="OauthToken">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="AuthToken" type="xs:string"/>
                    <xs:element name="TokenSecret" type="xs:string"/>
                    <xs:element name="ExpireDate" type="xs:string"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Data">
          <xs:complexType mixed="true">
            <xs:sequence>
              <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="tns:POSI"/>
                <xs:element ref="tns:TESTE"/>
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="POSI">
    <xs:complexType>
      <xs:all>
        <xs:element name="TimeStamp" type="xs:string"/>
        <xs:element name="RefreshInterval" type="xs:int" nillable="true"/>
        <xs:element name="Lon" type="xs:int" nillable="true"/>
        <xs:element name="Lat" type="xs:int" nillable="true"/>
      </xs:all>
    </xs:complexType>
  </xs:element>
  <xs:element name="TESTE">
    <xs:complexType>
      <xs:all>
        <xs:element name="TimeStamp" type="xs:string"/>
        <xs:element name="cenas" type="xs:float" nillable="true"/>
      </xs:all>
    </xs:complexType>
  </xs:element>
  <xs:element name="User">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="JabberID" type="xs:string"/>
        <xs:element name="OpenID" type="xs:anyURI"/>
        <xs:element name="OauthToken">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="AuthToken" type="xs:string"/>
              <xs:element name="TokenSecret" type="xs:string"/>
              <xs:element name="ExpireDate" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="diz" type="tns:diz"/>
  <xs:element name="dizPosi" type="tns:dizPosi"/>
  <xs:element name="dizPosiResponse" type="tns:dizPosiResponse"/>
  <xs:element name="dizResponse" type="tns:dizResponse"/>
  <xs:complexType name="diz">
    <xs:sequence/>
  </xs:complexType>
  <xs:complexType name="dizResponse">
    <xs:sequence>
      <xs:element name="return" form="qualified" minOccurs="0">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element ref="tns:POSI"/>
              <xs:element ref="tns:TESTE"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="dizPosi">
    <xs:sequence/>
  </xs:complexType>
  <xs:complexType name="dizPosiResponse">
    <xs:sequence>
      <xs:element name="return" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element name="TimeStamp" type="xs:string"/>
            <xs:element name="RefreshInterval" type="xs:int" nillable="true"/>
            <xs:element name="Lon" type="xs:int" nillable="true"/>
            <xs:element name="Lat" type="xs:int" nillable="true"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

比网络服务:

package ofelia;

import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;


@WebService(wsdlLocation = "WEB-INF/wsdl/agrupaServiceWS.wsdl", serviceName = "agrupaServiceWS", targetNamespace = "http://ofelia/")
public class agrupa {

    public agrupa() {

    }

@WebMethod
    @WebResult(targetNamespace = "http://ofelia/")
    public Data diz() {
        ObjectFactory fac = new ObjectFactory();
        OfeliaDataEx of = fac.createOfeliaDataEx();
        Header temp = new Header(); //fac.createHeader();
        temp.setState("ASW");
        temp.setTypeReq("REQ");
        //of.setHeader(value); setHeader(fac.createHeader());
        POSI x = new POSI();
        x.setLat(2);
        x.setLon(5);
        x.setRefreshInterval(1);
        x.setTimeStamp("asdasdsa");
        POSI y = new POSI();
        y.setLat(14);
        y.setLon(53);
        y.setRefreshInterval(3);
        y.setTimeStamp("qweqwe");
        TESTE teste = new TESTE();
        teste.setCenas(1.F);
        teste.setTimeStamp("asdasdasd");
        Data elem = new Data();  
        elem.getContent().add(y);
        //elem.getContent().add(teste);
        //elem.getContent().add(x);
        return elem;
    }

    public POSI dizPosi() {
        ObjectFactory fac = new ObjectFactory();
        OfeliaDataEx of = fac.createOfeliaDataEx();
        Header temp = new Header(); //fac.createHeader();
        temp.setState("ASW");
        temp.setTypeReq("REQ");
        //of.setHeader(value); setHeader(fac.createHeader());
        POSI x = new POSI();
        x.setLat(2);
        x.setLon(5);
        x.setRefreshInterval(1);
        x.setTimeStamp("asdasdsa");
        POSI y = new POSI();
        y.setLat(1);
        y.setLon(5);
        y.setRefreshInterval(3);
        y.setTimeStamp("qweqwe");
        TESTE teste = new TESTE();
        teste.setCenas(1.F);
        teste.setTimeStamp("asdasdasd");
        Data elem = new Data();  
        elem.getContent().add(y);
        elem.getContent().add(teste);
        //elem.getContent().add(x);
        return x;
    }
}

当我请求 diz 方法时,响应是“SOAP 消息中有错误”但是 http 内容看起来是正确的:

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:dizResponse xmlns:ns2="http://ofelia/">
            <ns2:return>
                <ns2:POSI>
                    <TimeStamp>qweqwe</TimeStamp>
                    <RefreshInterval>3</RefreshInterval>
                    <Lon>53</Lon>
                    <Lat>14</Lat>
                </ns2:POSI>
            </ns2:return>
        </ns2:dizResponse>
    </S:Body>
</S:Envelope>

任何人都可以尝试找出问题所在吗?

此致

4

1 回答 1

0

那么您使用 JDeveloper 测试 Web 服务功能吗?如果是这样,我过去曾遇到过一些问题。在 Java 中为您的 WS 生成一个客户端并以这种方式对其进行测试。

编辑:对不起,我打算在评论中写这个。

于 2013-07-10T13:16:38.527 回答