- PR -

axisのsoapプログラムについて

1
投稿者投稿内容
agilm
会議室デビュー日: 2009/04/06
投稿数: 2
投稿日時: 2009-04-07 15:13
現在axisを使って、soapを使ったwebサービスを試そうとしているのですが、配列を使った引数の渡し方と、配列を使った戻り値の受け方がわからず詰まっています。
webサービスは、楽天のトラベル地区コードAPIを使おうとしています。
以下にコードとエラーを記載させて頂きます。

---
import org.apache.axis.AxisFault;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
import java.net.URL;

public class TestClient {
public static void main(String [] args) {
try {
String endpoint =
"http://api.rakuten.co.jp/rws/soap/GetAreaClass/2008-02-14?wsdl";
Service service = new Service();
Call call = (Call) service.createCall();

call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName( new QName("http://soap.rws.rakuten.co.jp/", "operationGetAreaClass" ));
call.addParameter( "parameters", XMLType.SOAP_ARRAY, ParameterMode.IN );
call.setReturnType( XMLType.SOAP_ARRAY );

Object[] ret = (Object[]) call.invoke( new Object[] { "", "デベロッパーID", "1.11" } );
} catch (Exception e) {
e.printStackTrace();
}
}
}
---
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server
faultSubcode:
faultString: PARAMETER NOT FOUND
faultActor:
faultNode:
faultDetail:
{http://soap.rws.rakuten.co.jp/}Exception:<message>PARAMETER NOT FOUND</message>
{http://jax-ws.dev.java.net/}exception:<message>PARAMETER NOT FOUND</message><ns2:stackTrace/>

PARAMETER NOT FOUND
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:633)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanEndElement(XMLNSDocumentScannerImpl.java:719)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1685)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at TestClient.main(TestClient.java:26)
---

call.addParameter( "parameters", XMLType.SOAP_ARRAY, ParameterMode.IN );
call.setReturnType( XMLType.SOAP_ARRAY );
上の2つがおかしいんだろうと思うのですが、どうすればいいのか検討がつかない状態です。
axisで関数を参照する際の配列を使った引数と戻り値を扱う際のやり方を教えて頂けないでしょうか?
宜しくお願いします。

環境は以下です。
jdk1.5.0
axis1.4
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2009-04-07 20:33
WSDL2Javaで「地区コードAPI」のプロクシクラスを生成してみたらこんなシグネチャになりました。

コード:
public interface GetAreaClass20080214 extends java.rmi.Remote {
    public jp.co.rakuten.rws.soap.GetAreaClassResult operationGetAreaClass(jp.co.rakuten.rws.soap.GetAreaClassParam param) throws java.rmi.RemoteException, jp.co.rakuten.rws.soap.Exception;
}


引数にもメソッドの復帰値にも配列は(表面的には)出てこないようですけど?
質問がGetAreaClassResultやGetAreaClassParamクラスのことであれば普通にアクセサメソッドを使えばよいと思います。
質問と答えと合ってないかな?
agilm
会議室デビュー日: 2009/04/06
投稿数: 2
投稿日時: 2009-04-15 14:29
レスありがとうございます。
また、返信が送れてすいません。

私の最初の書き込みで引数と戻り値を配列と書いていましたが、クラスでした。勘違いしていました。すいません。

>WSDL2Javaで「地区コードAPI」のプロクシクラスを生成してみたらこんなシグネチャになりました。

私も調べてやってみました。ローカルに生成されたclassファイルをimportして従来どおりにコードを書いたら動きました。
きっかけをくださってありがとうございます。(一応、動いたコードを最後に書いておきます)

ただ、ローカルにファイルを作らずに、RPCの形でoperationGetAreaClassを使いたいとも思っています。
最初の書き込みに乗せたコードの

>call.addParameter( "parameters", XMLType.SOAP_ARRAY, ParameterMode.IN );
>call.setReturnType( XMLType.SOAP_ARRAY );
>Object[] ret = (Object[]) call.invoke( new Object[] { "", "デベロッパーID", "1.11" } );

の部分で引数にGetAreaClassParamを、戻り値には.GetAreaClassResultを指定しなくてはいけないと思うんですが、これはどう書けばいいのでしょうか?(最初の質問はこれが目的でした)
例えば、int型ならcall.invokeの部分は

call.addParameter("param",XMLType.XSD_INT,ParameterMode.IN);
call.setReturnType(XMLType.XSD_INT);
Integer ret=(Integer)call.invoke(new Object[] {new Integer("10"));

等とやればいいと思うんですが、クラスでやろうとするとやり方がわかりません。
お手数ですがまた教えて頂ければ幸いです。宜しくお願いします。

---

import java.net.*;
import javax.xml.namespace.QName;
import javax.xml.rpc.*;
import jp.co.rakuten.rws.soap.*;

public class TestClient
{
public static void main( String[] args )
{
try {
URL url = new URL( "http://api.rakuten.co.jp:80/rws/soap/GetAreaClass/2008-02-14" );
QName serviceName = new QName( "http://api.rakuten.co.jp/rws/soap/GetAreaClass/2008-02-14?wsdl", "GetAreaClass20080214Service" );
ServiceFactory factory = ServiceFactory.newInstance();
Service service = factory.createService(serviceName);
GetAreaClass20080214PortBindingStub gac = new GetAreaClass20080214PortBindingStub( url, service );

GetAreaClassParam param = new GetAreaClassParam();
param.setAffiliateId( "" );
param.setApiVersion( "1.11" );
param.setDeveloperId( "デベロッパーID" );

GetAreaClassResult gacr = new GetAreaClassResult();
gacr = gac.operationGetAreaClass( param );

System.out.println( gacr.getStatus() );

AreaLarge[] al = gacr.getLargeClass();
System.out.println( al[0].getLargeClassCode() );

} catch( java.net.MalformedURLException ex ) {
ex.printStackTrace();
} catch( ServiceException ex ) {
ex.printStackTrace();
} catch( org.apache.axis.AxisFault ex ) {
ex.printStackTrace();
} catch( java.rmi.RemoteException ex ) {
ex.printStackTrace();
}
}
}
1

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