Pour les services Web JAX-WS, le paramètre d'entrée hashmap peut poser un problème. Le schéma xsd généré semble incorrect pour les hashmaps. En plaçant la carte dans un objet wrapper, JAX-WS génère le fichier xsd correct.
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
}
Ensuite, le code PHP réussira. J'ai trouvé que je n'avais pas besoin de SoapVar ou de SoapParam et que je ne pouvais obtenir aucune de ces méthodes sans le MapWrapper.
$entry1['key'] = 'somekey';
$entry1['value'] = 1;
$params['map'] = array($entry1);
soapclient->doSomething(array('id' => 'blah', 'page' => 'blah',
'params' => $params));
Voici le xsd correct généré avec l'emballage
<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>
Voici le schéma incorrect généré par JAX-WS avec juste le 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>
Une note dernière. Wrapping HashMap < chaîne, chaîne > travaillé avec cette solution, mais HashMap < chaîne, objet > n'a pas. L'objet est mappé à xsd: anyType qui entre dans le service Web Java en tant qu'objet de schéma xsd plutôt que simplement en tant qu'objet.