- PR -

AxisでのArrayMapping

1
投稿者投稿内容
タカ
会議室デビュー日: 2002/12/09
投稿数: 2
投稿日時: 2002-12-09 17:33
Java暦半年の学生です。Axisを使用して、サービスからあるオブジェクトの配列を受け取るようなプログラムを作りたいと考えています。具体的には、DataというString型のデータを2つだけ保持するオブジェクトの配列をクライアント側が受け取るというプログラムです。いろいろと試してみたのですがどうしてもうまくいきません。データを保持するオブジェクトであるData単体のやり取りや、Dataを複数格納したVectorクラスでの受け渡し、またプリミティブタイプの配列では成功しました。Dataの配列はVectorで代用となるのですが、代用によるものではなく配列の受け渡しも成功させて使いたいです。どなたかご教授願います。
--環境---------
Windows2000
Tomcat4.0.6
j2sdk1.4.0_01
Axis1.0
-----------------
TomcatはLE-jdk14を使っていないのですが、オブジェクトの配列以外は成功したので、これで大丈夫だと思います。

まずはサービスプログラム、WSDDを作り、deployしました。サービスはただDataの配列に適当な値を入れて返すだけというものです。WSDDのマッピング部分も下に示します。Dataはsetter、getter、コンストラクタによる初期化の機能を持ったオブジェクトです。
--サービスプログラム------------
public class TestService {
public Data[] getData(String code) throws Exception {
//引数は使用しない
Data[] ret = null;
ret[0] = new Data( "a" , "a" );
ret[1] = new Data( "b" , "b" );
return ret;
}
}
-------------------------

----deploy.wsddのtypeMapping部分-----
<typeMapping
xmlns:ns="urn:Data-types"
qname="ns:Data"
type="java:Data"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
/>

<typeMapping
xmlns:ns="urn:Data-Array-types"
qname="ns:ArrayOfData"
type="java:Data[]"
serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
/>
------------------------------

クライアントプログラムの主要な処理から表示までの処理を示します。
----------------------------
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(options.getURL());

Class cls = Data[].class;
QName qName =new QName("urn:Data-Array-types", "ArrayOfData");
Class sf = ArraySerializerFactory.class;
Class df = ArrayDeserializerFactory.class;
call.registerTypeMapping(cls, qName, sf, df);

Class cls2 = Data.class;
QName qName2 =new QName("urn:Data-types", "Data");
Class sf2 = BeanSerializerFactory.class;
Class df2 = BeanDeserializerFactory.class;
call.registerTypeMapping(cls2, qName2, sf2, df2);

call.setOperationName(new QName("TestService", "getData"));
call.addParameter( "code" , XMLType.XSD_STRING , ParameterMode.IN );
call.setReturnType(new QName("urn:Data-Array-types", "ArrayOfData"));
Object[] ret = (Object[])call.invoke( new Object[] {code} );
Data[] result = (Data[]) ret;
for( int i = 0; i < result.length; i++ ) {
System.out.println( "1 : " + result[i].getCode1() + " 2 : " + result[i].getCode2() );
}
------------------------------------------

これで実行しても次のようなエラーが表示されました。
------------------------------
AxisFault
faultCode: {http://xml.apache.org/axis/}Server.userException
faultString: java.lang.NullPointerException
faultActor: null
faultDetail:
stackTrace: java.lang.NullPointerException
at TestService.getData(TestService.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:372)
(略)
------------------------------

TCPモニタで確認したところ、クライアントからサービスへは正常に稼動していますが、サービスからのメッセージにFaultが入って、返ってきていました。

次に、サービスのインターフェースを作成して、これからJava2WSDLよりWSDLファイルを作成し、さらにWSDL2Javaによりスタブ、スケルトン、WSDDファイルを作成しました。これに手を加え、上記と同様のサービスを作成して実行してみたところ、上に示したエラーとほとんど同じエラーが返ってきました。

私はマッピングがうまくいっていないためエラーが出るのかと思い、マッピング部分を中心に抄録しました。どなたかわかる方がいらっしゃいましたら、よろしくお願いします。
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-12-10 13:51
中込です。

以下、単なる転記ミスでしたら、無視してください。

> Data[] ret = null;
> ret[0] = new Data( "a" , "a" );
> ret[1] = new Data( "b" , "b" );
とコーディングしていれば、当然 java.lang.NullPointerException が発生します。
ret = new Data[2];
を必要としますね。
AXISの問題ではありません。
タカ
会議室デビュー日: 2002/12/09
投稿数: 2
投稿日時: 2002-12-10 15:21
できました!!
まだJavaをはじめて間もないのですが、基本がまだまだできていなかったようです。
お恥ずかしい限りです。
長々と書き込んだものを読み考えてくれた皆様、また返事を下さったnakagome様、どうもありがとうございました。
1

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