スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Java] Axis2でWebサービスのレシーバを作成

Axis2でSOAPを受信するWebサービス(=レシーバ)を作ります(・ω・)

Axis2ではSOAPメソッドの引数も戻値もapache.axiom.om.OMElement型になります。
例えば、以下のように送信されてくるデータ(XML)が解っている場合に、







xxxxxxxxx
xxxxxxxxx






下記ソースのelementには、上記XMLの<method-data>~</method-data>が返ります。
※上記XMLと下記ソースの「SOAPメソッド名」は同じ文字列が入ります。


public class MoradoWS
{
// 戻値がある場合は void => OMElement にする
public void SOAPメソッド名(org.apache.axiom.om.OMElement element)
{
element.build();
element.detach();

// 「method-data」が返る
String localName = element.getLocalName();

// が返る
OMElement elm = element.getFirstElement();
}
}


詳細は下記に秀逸な記事があるので参照してください(・ω・)
http://www.infoteria.com/jp/image/training/course/doc/sample_webservice.pdf

ところで僕が欲しいのは<SOAPメソッド名>の中のアトリビュート(属性)の値なんですが、
その場合どうしたら良いのだろう。。。(;´Д`)
スポンサーサイト

[Java] Axis2で作成したWebサービスの「namespace mismatch」について

現在、Axis2で送信されてきたSOAPの内容を受信するレシーバー(Webサービス)を作成中なのですが、
Axis2でWebサービスの作成をした場合に、デフォルトのservices.xmlを生成してしまうと
値を受け取るWebサービスの場合に以下のようなAxisFaultが発生する事があります。

org.apache.axis2.AxisFault: namespace mismatch
require http://morado106.fc2.com found urn:schemas-morado106:fc2:com


上記の理由でAxisFaultした場合の対処ですが、該当するサービスのフォルダ

/WEB-INF/services/[Webサービス名のフォルダ]/META-INF/services.xml

services.xmlに<schema>タグを追加し、schemaNamespaceに正しいスキーマ名を入力します。
(下記の例だと「urn:schemas-morado106:fc2:com」が正しい場合です)

<service name="moradoWS">
 <Description>Please Type your service description here>/Description>
 <schema schemaNamespace="urn:schemas-morado106:fc2:com" />
 <messageReceivers>
  <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
  <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
 </messageReceivers>
 <parameter name="ServiceClass" locked="false">com.fc2.morado106.moradoWS</parameter>
</service>

後は、Webサービス作成の際に修正したservices.xmlを以下で指定してやるだけです(・ω・)

servicesxml.png

[Java] Axis2で作成したWebサービスからServletContextを取得

こんな感じで(´ω`)


import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPConstants;
import javax.servlet.*;

public class MyWS
{
public void Event() // SOAP Method
{
MessageContext mc = MessageContext.getCurrentMessageContext();
ServletContext con = (ServletContext) mc.getProperty(HTTPConstants.MC_HTTP_SERVLETCONTEXT);
MyBeen been = (MyBeen)con.getAttribute("MyBeen");
System.out.println("=======" + MyBeen.getMessage() + "========");
}
}

[Java] Axis2のSOAPヘッダについて

Axis2で作成したクライアント(スタブ)にSOAPヘッダを追加するには、


MyServiceStub stub = new MyServiceStub("http://localhost:90/AxisTest/services/MyService/");
org.apache.axis2.client.ServiceClient sc = stub._getServiceClient();
javax.xml.namespace.QName qName = new javax.xml.namespace.QName("aaa", "bbb", "ccc");
sc.addStringHeader(qName, "ddd");

とします。
以下、実行結果。





ddd



morado





あと、最近仕事で使ってて気付いたんですが、リクエスト時にAxis2が勝手に
<soapenv:Header>~</soapenv:Header>を追加する事があります。
こんな感じで↓。

soapheader01.png

仕事では余計な↑コレが原因でSoapFaultしてしまい、原因究明に大分苦労しました。。。orz
(S社サポート担当様、原因究明本当にありがとうございました(つд∩))

この<soapenv:Header>~</soapenv:Header>を取っ払うには、
WEB-INF/conf/axis2.xmlから以下の部分を除去もしくはコメントアウトします。



[Java] Axis2でWSDLからSOAPサーバーを作成&ヨタ

前回、Axis2のWSDL2Javaからスタブ(クライアント)を作る方法を記事にしたのですが、
スケルトン(サーバー)を作る方法もあったので掲載しておきます。

前回同様、Axis2を展開したフォルダの中にあるbin/wsdl2java.batを使用します。
コマンドプロンプト(XPの場合)で以下のように入力します。

>[~Axis2を展開したフォルダ]\bin\wsdl2java.bat -uri [wsdlのアドレス] -s -ss -sd -ssi
例:>C:\axis2\bin\wsdl2java.bat -uri MyService.wsdl -s -ss -sd

ちなみにオプションの
-s・・・スケルトンの生成(省略するとスタブ)
-ss・・・サーバーサイドコード生成
-sd・・・service.xmlの生成
-u・・・スタブ生成時にサービスとバインディングのソースを別にする

。。。らしいです(・ω・)
※-uをオプションに付けないクラスは一つのソースファイルに大量の内部クラスが出来ます。
 付けると大量のソースファイルができます。(WSDLの内容にもよるけど)

これを実行するとsrcフォルダに大量のJavaソースと(WSDLの内容にもよりますが)
[サービス名]Skeleton.java(例でいくと「MyServiceSkeleton.java」)が出来るのですが、
その[サービス名]Skeleton.javaに内容を実装⇒Antビルドでaar化⇒デプロイでおk。。。みたいな。

詳細は↓に秀逸な記事があるのでそちらを見てくれればいんでないかと。
http://d.hatena.ne.jp/modalblue/20080817/1218971413

あと最近仕事で使ってみて気づいたんですが、Axis2でスタブクラスを作成した際に
WSDL内にAbstractなエレメントがあると、スタブ化に失敗する事が。。。(;´Д`)
(Abstractの方はちゃんとクラス化されるものの、実装エレメントがクラス化されないと言うか)
当初はエラーの原因がわからず、かなり困惑したのですが、↑が原因とわかり
スタブソースの改変を余儀なくされました。
(※追記)Axis2のバージョンが1.4.1の時に起きました。1.5.2で作ったスタブは大丈夫でした。


最後にお便利ツールの紹介を。
Microsoftで配布している「MSSOAP(SOAP Toolkit 3.0 )」をマシンにインスコすると
「Trace Utility」ってのも一緒にインスコされるのですが、
これを使うとSOAPの送受信の内容をモニタする事ができます。

例えば、Listenのポート[8080]でForward Toのホスト[www.yahoo.co.jp]ポート[80]とかにしておいて
http://localhost:8080/にアクセスすると、下図のような感じで(SOAPに限らず)
送受信した内容を見ることができます(素敵すぐる)。
(要はFoward Toで指定したホスト+ポートへのアクセスをlocalhost+Listenポートにスワップする)
先に書いたエラーの原因追及等にも役立って、大変重宝しています(´ω`)

あ、ちなみにWin鯖のWebサービスにAxis2で作成したStubクラス(クライアント)を使用して
アクセスする場合
に、以下の画像のようにちゃんと表示されない場合は、
Stubオブジェクトを以下のように設定をすると、ちゃんと表示されるようになります。

MyServiceStub stub = new MyServiceStub("http://localhost:90/AxisTest/services/MyService/");
stub._getServiceClient().getOptions().setProperty(
  org.apache.axis2.transport.http.HTTPConstants.CHUNKED,
  org.apache.axis2.Constants.VALUE_FALSE);


Pagination

Utility

プロフィール

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。