2

引数の 1 つとして HashMap を持つ JBossWS 3.1.2 を使用して Web サービスを開発しようとしています。このバージョンの JBossWS を使用しているのは、私が使用しているバージョンの JBoss と共に配布されているものだからです。wsprovide を使用して WSDL を生成し、wsconsume を使用して WS クライアント スタブを作成しています。

私の WebService の簡略化されたバージョンは次のとおりです。

@WebService(targetNamespace = "http://localhost/ping", serviceName = "Ping")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Ping {
    @WebMethod
    @WebResult(name="result")
    public String ping(@WebParam(name="arguments") HashMap arguments) {
        return "pong";
    }
}

wsprovide によって作成された WSDL には、以下が含まれます。

<types>
    <xs:schema targetNamespace='http://localhost/ping' version='1.0' xmlns:tns='http://localhost/ping' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
        <xs:complexType name='hashMap'>
            <xs:complexContent>
                <xs:extension base='tns:abstractMap'>
                    <xs:sequence/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:complexType abstract='true' name='abstractMap'>
            <xs:sequence/>
        </xs:complexType>
    </xs:schema>
</types>

生成されたクライアント コードには、空の抽象クラス AbstractMap.java と空のクラス HashMap が含まれています。

次のような WSDL が生成されることを期待していました。

<complexType>
    <sequence>
        <element name="key" type="anyType" />
        <element name="value" type="anyType" />
    </sequence>
</complexType>

また、HashMap をカスタム クラス (ParameterMap) でラップしようとしましたが、同じことが多くなりました。

私が見ていない次のステップはありますか?何か足りないのでしょうか、それとも JBossWS を使用して Web サービスを開発するためのボトムアップ アプローチの制限ですか?

4

1 に答える 1

6

答えは別の投稿にありました PHP soapclient リクエストに値として配列を渡すにはどうすればよいですか?

JAX-WS ソリューションに関する PHP の質問を調べようとは思いもしませんでした...

HashMap は、HashMapWrapper.java (または何でも) と呼ばれる別の Java クラスでラップする必要があります。

public class HashMapWrapper {
    public HashMap<String, Object> parameters;
}

HashMap の代わりにラッパー クラスを使用するには、ping メソッドの呼び出しを変更する必要があります。

public String ping(@WebParam(name="arguments") HashMapWrapper arguments) {

これにより、適切な WSDL が生成され、さらに有用な Java スタブが生成されます。

于 2011-01-11T17:13:16.757 に答える