WebService - AXIS

wikiにあげる前に覚え書きを予てメモをφ(. . )
長い上に、普段の内容とふいんき(←なぜか変換できないw)が違うので隠しまw

AXISのインストール

これはマニュアル通り。
んで、activation.jar, mail.jar, xmlsec.jarが足りないので別途入手して/WEB-INF/libにつっこむ。

WebサービスをPOJOでこさえる

@ITにあったサンプルを失敬して単純にパラメータで渡された値を加算していくだけのPOJOを作成。

package sample;
public class SimpleAddBean implements java.io.Serializable {
    private int resultValue;
    private int inputValue;
    public SimpleAddBean() {
        resultValue = 0;
        inputValue = 0;
    }
    public void add() { resultValue = resultValue + inputValue; }
    public int getInputValue() { return inputValue; }
    public void setInputValue(int inputValue) { this.inputValue = inputValue; }
    public int getResultValue() { return resultValue; }
    public void setResultValue(int resultValue) { this.resultValue = resultValue; }
}

Webサービスとして公開するためにWSDDを作成

<deployment xmlns="http://xml.apache.org/axis/wsdd/" 
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="SimpleAddService" provider="java:RPC">
        <parameter name="className" value="sample.SimpleAddBean"/>
        <parameter name="allowedMethods" value="*"/>
        <parameter name="scope" value="application"/>
    </service>
</deployment>

AXISに付属のANT-TASKを使ってデプロイ。

クライアントの準備

POJOからWSDLを作成する

クライアント側にサービスへの手続き方法を記述したWSDLを提供するため。
これもANT-TASKから実行。

<axis-java2wsdl
    output="${client.dir}/SimpleAddService.wsdl"
    location="http://localhost:8080/axis/services/SimpleAddService"
    classname="sample.SimpleAddBean"
    namespace="urn:sample">
    <mapping 
        namespace="urn:sample" 
        package="sample" />
</axis-java2wsdl>

namespaceがミソぽい。

WSDLからクライアント用スタブを作成

ServiceクラスやCallクラスを使ってサービスにアクセスするのが面倒なので、スタブを利用。
このためにPOJOからWSDLを作ったようなもの。
やっぱりこれもANT-TASKで。

<axis-wsdl2java 
    url="${client.dir}/SimpleAddService.wsdl"
    output="${client.dir}/src">
    <mapping
        namespace="urn:sample" 
        package="sample" />
</axis-wsdl2java>

クライアントの作成

WSDLからスタブを作成したので、これをつかってサービスにアクセスする。

package sample;
public class SampleClient {
    public static void main(String[] args) {
        try {
            SimpleAddBeanServiceLocator locator = new SimpleAddBeanServiceLocator();
            SimpleAddServiceSoapBindingStub stub = 
                (SimpleAddServiceSoapBindingStub) locator.getSimpleAddService();
            stub.setInputValue(3);
            stub.add();
            Integer result = stub.getResultValue();
            System.out.println(result.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
}

まとめ

やってみるとわかるけど、スタブを利用した方が遙かに楽。
利用する側としても、提供されたものを使えばいいだけだし。


しっかし、namespaceにははまった。
というかドキュメントを読まず適当にやりすぎたw
どうりでクライアントからサービスが見つからないわけだよ_| ̄|○