- PR -

AxisでSOAP Attachmentの方法

投稿者投稿内容
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-07-08 17:23
はじめまして、UKです。このたび大学の卒業研究でAxisを用いたWebサービスについて調べる
ことになりました。そこでXMLファイルをクライアント⇔サーバーで伝送したいのですが、
SOAP Attachmentの方法が調べたのですがまったくわからず困っています。
とりあえずファイルをString型に変換してから伝送しているのですが、できれば添付ファイル
という形でそのままファイルを伝送したいのです。
よければ皆さんの作成したSOAP Attachmentを使用したプログラムを教えていただけないでしょうか?
何か例になるソースさえあれば勉強しやすいと思うので、探したのですが自分では見つけること
ができませんでした。
どなたか、ご教授お願いします
いたち
常連さん
会議室デビュー日: 2003/04/25
投稿数: 27
投稿日時: 2003-07-09 09:06
はじめまして、いたちです。

SUNのチュートリアルに関連記事がありますよ。
http://java.sun.com/webservices/docs/1.1/tutorial/doc/

[Chapter 12: Web Services Messaging with JAXM]の[Tutorial]に
[Adding Attachments]というのがあります。
ご参考になれば。。。
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-07-10 14:01
ありがとうございます、いたちさん。
教えていただいたページを読んで、書いてある内容は
ある程度理解できるのですが、実際掲載されていることをサーバー側、クライアント側、そして
WSDLの中身でどのように使用してよいのかわかりません。よければもう少し詳しく教えていただけないでしょうか?
Attachmentを使用してもサーバ側のインターフェース作成→Java2WSDLでWSDLファイル作成→
WSDL2JavaでサービスとWSDDファイルの作成といった具合の作成手順でつくれるのですか?
いたち
常連さん
会議室デビュー日: 2003/04/25
投稿数: 27
投稿日時: 2003-07-10 21:25
ども、いたちです。

引用:

Attachmentを使用してもサーバ側のインターフェース作成→Java2WSDLでWSDLファイル作成→
WSDL2JavaでサービスとWSDDファイルの作成といった具合の作成手順でつくれるのですか?



Java2WSDLについてはよく知らないので予想になってしまいますが。。。
Attachmentを使った場合、例えばBASE64で送る内容をWSDL上にスキーマで定義するのは難しいのではないでしょうか。
ということは、Java2WSDLのサポートもあまり期待できないと思います。

ためしにやってみて、<message>の内容がどうなっているか見てはどうでしょうか?

ちなみに、JAXMで作ったWebサービスから自動的に的確なWSDLを作成するツールってあるのでしょうか?
というか、実現できない??
kan
ベテラン
会議室デビュー日: 2002/11/28
投稿数: 55
投稿日時: 2003-07-12 01:11
Axis でAttachmentを使うサンプルならば、samples\attachmentsに含まれているのですが、これでは駄目なのでしょうか?


ちなみにこのサンプルはJAAS準拠ではありません。
JAAS準拠のサンプルは以下に見つかります。
http://dev2dev.bea.com/code/websvcs.jsp
この場合はHandlerを使うことになります。
AxisでのHandlerの設定方法はsamples\jaxrpc\helloを御覧下さい。

もう一つdocument styleのAPIを使う方法があります。
これはsamples\messageを見て下さい。

ちなみにAxisではJAXMのサーバは実装されていなかったと思います。
JAXMのクライアントを実装して呼び出すことは可能です。

AttachmentのWSDLについてはよく知らないのですが、DIMEであれば以下に説明がありました。DIMEはAxisでも実装することができます。
http://www.gotdotnet.com/team/xml_wsspecs/dime/WSDL-Extension-for-DIME.htm
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-07-12 10:00
Kanさん、いたちさん、お答えいただきありがとうございます。
samples\attachmentsのサンプルはclassファイルしかないから…と思っていましたが、
AXISのページにソースファイルやwsddがあったのでそれらを調べていきたいと思います。
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-07-13 15:10
どうもUKです。
早速例のsamples\attachments例を参考に簡単なプログラムを作ってみましたが、エラーが
出てしまいます。

----サーバー側(SimpleAttachmentsServices.java)------------------------
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import javax.activation.DataHandler;

public class SimpleAttachmentsServices {
public boolean hello(String msg, DataHandler[] attachments){
if(attachments!=null){
for(int i=0;i<attachments.length;i++){
String fname = attachments[i].getName();
Object content = attachments[i].getContent();
}

}
return true;
}
}

---クライアント側(AttachmentClient.java)------------------------------
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory;
import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory;

import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;

import java.net.URL;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;


public class AttachmentClient {
public static void main(String args[]) {
Service service = null;
Call call = null;
String message = "succedd";
try {
service = new Service();
call = (Call)service.createCall();
call.setTargetEndpointAddress(new URL(args[0]));
call.setOperationName(new QName("SimpleAttachmentsServices", "hello"));
QName qnameAttachment = new QName("SimpleAttachmentsServices", "DataHandler");
call.registerTypeMapping(DataHandler.class, qnameAttachment,JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class);
call.addParameter("msg", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("attachments", XMLType.SOAP_ARRAY,ParameterMode.IN);
call.setReturnType(XMLType.XSD_BOOLEAN);
call.setProperty(call.ATTACHMENT_ENCAPSULATION_FORMAT,call.ATTACHMENT_ENCAPSULATION_FORMAT_DIME);

DataHandler dh = new DataHandler(new FileDataSource("attachments.txt"));
Object ret = call.invoke(new Object[]{"message",new DataHandler[]{dh}});
} catch (Exception e) {
e.printStackTrace();
}
}
}

---エラー----------------------------------------------------------------
- Mapping Exception to AxisFault
AxisFault
faultCode: {http://xml.apache.org/axis/}Server.userException
faultString: org.xml.sax.SAXException: No deserializer defined for array type {SimpleAttachmentsServices}DataHandler
faultActor: null
faultDetail:
stackTrace: org.xml.sax.SAXException: No deserializer defined for array type {SimpleAttachmentsServices}DataHandler
               ・
               ・
               ・
               ・

ご教授宜しくお願いします。
kan
ベテラン
会議室デビュー日: 2002/11/28
投稿数: 55
投稿日時: 2003-07-13 17:26
WSDDでtypeMappingを設定されていますか?
これもsamples\attachments\attachdeploy.wsddを参考にするとよいです。

スキルアップ/キャリアアップ(JOB@IT)