日期:2014-05-19  浏览次数:20839 次

基于Axis的web service调用问题
我刚开始用webservice,问个很弱智的问题,或者干脆就理解错误了,请大家帮忙看看!

在用xfire开发webservice的时候,用myeclipse自带的webservice工具,能自动生成所有的远程调用代码,
但是现在要调用的webservice是用Axis开发的,只能用WSDL2Java工具来生成调用代码。

生成以后我用以下程序来测试远程方法调用:

try {
String endpoint = "http://10.105.128.13:9080/app/services/Hinge";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(endpoint));
call.setOperationName("TXIOODGenTableSID");//这里想指定服务器端方法名称
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://10.105.128.13:9080/app/services/Hinge");
String ret = (String) call.invoke(new Object[] {});
System.out.println(ret);
} catch (Exception e) {
e.printStackTrace();
}

运行的时候有以下提示:
...
[root@localhost ~]# java -classpath .:axis.jar:jaxrpc.jar:commons-discovery-0.2.jar:commons-logging-1.0.4.jar:wsdl4j-1.5.1.jar:saaj.jar Main
2008-9-8 14:10:03 org.apache.axis.utils.JavaUtils isAttachmentSupported
¾¯¸æ: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
javax.xml.rpc.security.auth.username
javax.xml.rpc.security.auth.password
javax.xml.rpc.session.maintain
javax.xml.rpc.soap.operation.style
javax.xml.rpc.soap.http.soapaction.use
javax.xml.rpc.soap.http.soapaction.uri
javax.xml.rpc.encodingstyle.namespace.uri
javax.xml.rpc.service.endpoint.address
transport_name
attachment_encapsulation_format
axis.connection.timeout
javax.xml.soap.character-set-encoding
AxisFault
 faultCode: {http://xml.apache.org/axis/}Client
 faultSubcode: 
 faultString: No such operation 'TXIOODGenTableSID'
 faultActor: 
 faultNode: 
 faultDetail: 
  {http://xml.apache.org/axis/}hostname:sx_ylyc02

No such operation 'TXIOODGenTableSID'
  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(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
...

看异常是说'TXIOODGenTableSID'操作不存在。
前辈们帮忙看看是不是我用的有问题,还是理解的就不对?
另外,如果我拿到服务提供方的wsdl文件,是不是就能知道他要发布的所有信息了(包括远程调用方法的名称、参数)?


------解决方案--------------------
你生成客户端以后就可以使用stubs方式调用了 为什么还要用这种dii方式?

生成的客户端有一个接口继承Service类:interface XXXService extends javax.xml.rpc.Service
还有一个该接口实现类: XXXServiceLocator implements XXXService
还有一个接口继承Remote类:interface XXXPortType extends java.rmi.Remote
还有一个实现这个接口XXXSoapBindingStub implements XXXPortType

你拿着这四个类就可以调用
Java code
          XXXService service = new XXXServiceLocator();    
        XXXSoapBindingStub client = (Stub) service.getXXX();            
      System.out.println(client.MOTHOD(PARAM1...));

------解决方案--------------------
服务端提供wsdl,你的客户端可以用wsdl生成代码,服务端的方法名称、参数从wsdl里面是可以找到的