JAX-WS Web サービスの場合、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<String, String> のラッピングはこのソリューションで機能しましたが、HashMap<String, Object> は機能しませんでした。オブジェクトは xsd:anyType にマップされ、単なるオブジェクトではなく xsd スキーマ オブジェクトとして Java Web サービスに入ります。