Для веб-сервисов JAX-WS может быть проблема с входным параметром hashmap. Сгенерированная схема xsd кажется неправильной для хэш-карт. Помещение карты в объект-оболочку заставляет 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));
Вот правильный xsd, сгенерированный с помощью оболочки
<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>
Вот неверная схема, сгенерированная JAX-WS с хеш-картой
<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 - нет. Объект сопоставляется с xsd: anyType, который входит в веб-сервис java как объект схемы xsd, а не просто как Object.