xs:choice を使用して SOAP サービスを実装しようとしていますが、うまくいきません。
まず、xcj を使用してクラスを生成するよりも xml スキーマを作成しましたが、応答が正しいという事実にもかかわらず、サービスは応答を検証していません。
まず最初に 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>
Web サービスより:
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 メソッドをリクエストすると、respose は「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>
誰でも問題の場所を特定できますか?
よろしくお願いします