對於JAX-WS webservices,它可能是散列表輸入參數的問題。生成的xsd模式似乎對hashmaps不正確。將映射放置在包裝器對象中會導致JAX-WS輸出正確的xsd。
public class MapWrapper {
public HashMap<String, String> map;
}
// in your web service class
@WebMethod(operationName = "doSomething")
public SomeResponseObject doSomething(
@WebParam(name = "id") String id,
@WebParam(name = "page") String page,
@WebParam(name = "params") MapWrapper params {
// body of method
}
然後php代碼就會成功。我發現我不需要SoapVar或SoapParam,並且無法使這兩種方法在沒有MapWrapper的情況下工作。
$entry1['key'] = 'somekey';
$entry1['value'] = 1;
$params['map'] = array($entry1);
soapclient->doSomething(array('id' => 'blah', 'page' => 'blah',
'params' => $params));
這裏是與包裝物
<xs:complexType name="mapWrapper">
<xs:sequence>
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="key" minOccurs="0" type="xs:string"/>
<xs:element name="value" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
生成正確的XSD這裏是JAX-WS只HashMap的最後
<xs:complexType name="hashMap">
<xs:complexContent>
<xs:extension base="tns:abstractMap">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="abstractMap" abstract="true">
<xs:sequence/>
</xs:complexType>
一個音符所產生的不正確的架構。包裝HashMap <字符串,字符串>與此解決方案一起工作,但HashMap <字符串,對象>沒有。 Object被映射爲xsd:anyType,它作爲xsd模式對象而不是Object來進入java webservice。