【Java】WebLogicでのSOAPサービス公開方法が意外と簡単だった
今回、SOAPのWebサービスについて調べる機会があったので検証結果をメモ。
今どきWebサービスと聞いてSOAPをイメージする人はほとんどいないと思われる。RESTと比べると重厚で使いにくいイメージもあるが、それでも一部のパッケージ製品などやエンタープライズJavaの世界ではまだ現場で使われることもあるSOAP。SOAPについてはいろいろな文書があるのでここでは説明を省略する。
結論を言うと、Javaで普通に書いたコードにアノテーションを付けるだけでWSDLが自動ででき、思った以上に簡単に公開することができた。
環境情報は以下。WebLogicを使っているが、後半で説明するTestのところ意外はWebLogic固有の話はないはず。
- WebLogic12c (12.1.3)
- Java EE 6
SOAP Webサービス作成
まず、Eclipse上で「動的Webプロジェクト」を作成する。今回はプロジェクト名を「SoapApp」とした。
まず、Webサービスとして公開するロジックを実装する。今回は例として、二つの数値を受け取り、足し算・引き算した結果を返すだけの簡単なクラスとする。注意点として、クラスに@WebServiceアノテーションを付ける。
Calculator.java
package web; import javax.jws.WebService; @WebService public class Calculator { public int add(Calc calc) { return calc.getNum1() + calc.getNum2(); } public int sub(Calc calc) { return calc.getNum1() - calc.getNum2(); } }
二つの数値は、intのフィールドを二つ持つPOJOクラスとして実装した。ロジックを実装したクラスでは、このPOJOクラスのインスタンスを一つ引数として受け取る。ここでも、@XmlRootElementを持たせる。
Calc.java
package web; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Calc { private int num1; private int num2; public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } }
プロジェクトは以上で完成。web.xml等、他のファイルには一切変更を加えていない。
SOAPアプリをデプロイ
作ったSOAPアプリをWARにしてWebLogic 12cにデプロイする。
たったこれだけでCalculatorServiceというWebサービスが公開されている。
以下のURLにアクセスすると、以下のようなSOAP定義が示された画面が表示される。WSDLもあるよう。
http://host:port/SoapApp/CalculatorService
Webサービスをテスト
先ほどの画面に「Test」というリンクからテストを行うことができる。
クリックすると、以下のように定義した各メソッドごとのサービスをテストできる。
addのTestをクリックしてみる。
こんなテスト画面が出る。
Raw Messageボタンをクリックすると、リクエスト用のXMLを確認することができる。
ページ下部のInvokeをクリックすると、Webサービス呼び出しが実行される。
実行結果もTest ResultsとしてXMLレスポンスが表示されている。今回の結果として、「2」と「3」を入力しaddメソッドのサービスを読んだので、結果の「5」が正しく返されていることが分かる。
まとめ
以上、とても簡単な例だが、SOAPのWebサービスが利用可能になったことが分かる。SOAPの複雑なルールやWSDLを特に意識することなく、通常のJavaクラスにロジックを書けば、あとはアノテーションを付けるだけでサービスを公開できた。さらにWebLogicだと簡単なSOAPテスト画面も用意されているので、比較的わかりやすく開発できそうな印象だった。なお他のアプリケーションサーバでもこれに近しいことはできそうだけど、そこまでは未調査。
今度は公開されているWSDLからSOAPサービスを呼び出すクライアント側についても調査したい。以上!
- 2015/3/31 追記
クライアント側の検証記事を追加しました。