现在有3个系统,分别是A,B,C。现在我在系统A中点击相应的按钮(假设的),将触发一个动作是用WebService调用系统B的一个方法b,b这个方法中又用WebService调用系统C的一个方法c,然后C返回B一个String用于说明是否调用成功,再次当C返回B一个String后,B再返回个String返回给A,也就是说在A调用B还没结束时,B用调用了C。(注意系统B中的方法b,即接受A的调用同时又调用C)这个过程中共用了两次WebService调用,而且比较特殊,因为在B调用C时A还是连接B的。这个过程中A调用B成功,但是当B调用C时就报错:org.apache.axis2.AxisFault: org.apache.axis2.addressing.EndpointReference.getAddressAttributes()Ljava/util/ArrayList;
这个错误提示应该是连接不到的错误。但是,我用A直接调B可以连通,用A直接调C可以连通,用B直接调C可以连通。他们两两之间是能连接通的。我用的是axis2,A、B、C系统都是java做的,服务器用的是JBOSS望高人能解决小弟的问题,不胜感激。并拜其为师。如果不清楚问题的可以QQ联系我,小弟QQ号:80229899 , 邮箱是: [email protected]

解决方案 »

  1.   

    Are A, B, C deploied in the same server? or different servers?
      

  2.   

    小弟把源代码发出来让大家看看
    这是系统A的一个测试类。
    package com.client;import javax.xml.namespace.QName;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.rpc.client.RPCServiceClient;public class TestCYL {
    private static EndpointReference targetEP0R = new EndpointReference("http://localhost:8080/axis2/services/EcardService");
    //webservice地址 public static void main(String[] args) {
    try {
    String strHello = "我是CYL系统!";

    int cid = 1;
    int tid = 2;

    String param = cid+","+tid;

    RPCServiceClient serviceClient = new RPCServiceClient(); ; 
    Options options = serviceClient.getOptions(); 
    options.setTo(targetEP0R);

    //待调用服务的名称
    QName opPrint = new QName("http://webservice.zzxy.com/xsd", "getCYLRequest");

    //服务参数,是个对象数组 
    Object[] opGetVersionArgs = new Object[] { cid,tid }; 

    //返回类型
    Class[] returnTypes = new Class[] { Boolean.class };

    //阻塞调用,得到返回值
    Object[] response = serviceClient.invokeBlocking(opPrint,opGetVersionArgs,returnTypes);

    Boolean strConn = (Boolean) response[0];

    System.out.println("最后返回--->"+strConn); } 
    catch(AxisFault axisFault) {
    axisFault.printStackTrace();
    }
    }
    }
      

  3.   

    这是系统B的WebService的公开方法,在此方法中又WebService调用了系统C的公开方法getEcardRequest
    public String getCYLRequest(int cardID, int tableID){
    System.out.println("收到的系统A发过来的参数是"+cardID+","+tableID);
    String strYResultXML = "";

    String strWSURL = "http://192.168.6.188:9090/axis2/services/EHubService";
    String strClassURL = "http://webservice2.zzxy.com";
    String strMethodName = "getEcardRequest";

    System.out.println("--->1");
    try {
    EndpointReference targetEP0R = new EndpointReference(strWSURL);

    //设置连接WebService的URL
    RPCServiceClient serviceClient = new RPCServiceClient(); ; 
    Options options = serviceClient.getOptions(); 
    options.setTo(targetEP0R);

    System.out.println("--->2");

    //待调用服务的名称,即方法名
    QName opPrint = new QName(strClassURL, strMethodName);

    System.out.println("--->3");

    //给EHub方法传递的参数,是个对象数组 
    Object[] opGetVersionArgs = new Object[] { cardID,tableID }; 

    System.out.println("--->4");

    //设置EHub方法的返回类型
    Class[] returnTypes = new Class[] { String.class };

    System.out.println("--->5");

    //阻塞调用,得到返回值
    Object[] response = serviceClient.invokeBlocking(opPrint, opGetVersionArgs, returnTypes);

    System.out.println("--->6"); strYResultXML = response[0].toString();
    System.out.println(strYResultXML); 


    catch(AxisFault axisFault) {
    axisFault.printStackTrace();
    }
    return strYResultXML;
    }
      

  4.   

    这是系统C的公开的服务方法getEcardRequest,用于接受系统B的调用并返回一字符串
    public String getEcardRequest(int cardID, int tableID) {

    System.out.println("连接成功!参数为:"+cardID+","+tableID);

    String strYResultXML = "哈哈,成功"+cardID+","+tableID;

    return strYResultXML;
    }
      

  5.   

    在系统B的public String getCYLRequest(int cardID, int tableID)方法中的第一行语句(如下):
    System.out.println("收到的系统A发过来的参数是"+cardID+","+tableID); 
    在调用过程中是可以正常输出的如:“收到的系统A发过来的参数是1,2”。这说明A是可以和B连通的,
    但是系统B调用系统C的getCYLRequest方法时,直接在系统B的控制台报错(如下):
    org.apache.axis2.AxisFault: org.apache.axis2.addressing.EndpointReference.getAddressAttributes()Ljava/util/ArrayList; 而系统C的控制台根本就没有反应(既不报错,又不输出字符串),系统C的getCYLRequest方法的第一行  System.out.println("连接成功!参数为:"+cardID+","+tableID);  就根本没有输出任何东西,  由此说明系统B根本就没有链接到系统C
    望高手指点啊!!!!!!!!!!!!!!!!!!
      

  6.   

    再补充一点:系统A是java工程没有部署到服务器上,用mainz()方法测试的;
    系统B是部署在jboss上的,系统C部署在tomcat上。工程都是在本机上。
    另外再说明一点:系统A不通过系统B是可以连接到系统C的。
      

  7.   

    在系统B调用系统C的getCYLRequest方法里面也输出看下
      

  8.   


    输出过了结果是:而系统C的控制台根本就没有反应(既不报错,又不输出字符串),系统C的getCYLRequest方法的第一行  System.out.println("连接成功!参数为:"+cardID+","+tableID);  就根本没有输出任何东西,  由此说明系统B根本就没有链接到系统C 。
    请参看10楼的叙述
      

  9.   

    用tcpmonitor监控一下发送和接受到的消息
    这样就可以判断到底发没法消息。
      

  10.   

    绑定服务的话一般一(客户端)对多(服务器端).....似乎没有一对一,在对一,在对一.......
    可能偶少见多怪,没这么用过,理论上也通不过吧,web服务本身就是松耦合的存在而被复用,服务提供者不可能在调用其他服务提供者,这样岂非
    失去web服务优点了,人家怎么也是面对组件级别的,呵呵;
      

  11.   

    楼上这位大哥,如果没用过WebService或是不了解的话,请先去官网看看WebService到底是啥东东再来这帮助我。