NutzCN Logo
问答 我想问一下,axsi2的rpc调用方式,如何传入复杂对象?
发布于 2804天前 作者 qq_6427b776 1798 次浏览 复制 上一个帖子 下一个帖子
标签:

public class WsClient {
public static void testRPCClient() {
try {
// axis2 服务端
String url = "http://localhost:8080/sa/services/updateAlertStatus?wsdl";

       // 使用RPC方式调用WebService
       RPCServiceClient serviceClient = new RPCServiceClient();
       // 指定调用WebService的URL
       EndpointReference targetEPR = new EndpointReference(url);
       Options options = serviceClient.getOptions();
       // 确定目标服务地址
       options.setTo(targetEPR);
       // 确定调用方法
       options.setAction("urn:updateStatus");

       /**
        * 指定要调用的getPrice方法及WSDL文件的命名空间 如果 webservice 服务端由axis2编写 命名空间
        * 不一致导致的问题 org.apache.axis2.AxisFault: java.lang.RuntimeException:
        * Unexpected subelement arg0
        */
       QName qname = new QName("http://www.w3.org/2001/XMLSchema", "updateStatus");
       WsUpdateAlertReq reqObj = new WsUpdateAlertReq();
       reqObj.setAlertCode(148368863803747L);
       reqObj.setAlertType(1);
       // 指定getPrice方法的参数值
       Object[] parameters = new Object[] { reqObj };

       // 指定getPrice方法返回值的数据类型的Class对象
       Class[] returnTypes = new Class[] { WsUpdateAlertReq.class };
       // 调用方法一 传递参数,调用服务,获取服务返回结果集
       OMElement element = serviceClient.invokeBlocking(qname, parameters);
       // 值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
       // 我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
       String result = element.getFirstElement().getText();
       System.out.println(result);
       // 调用方法二 getPrice方法并输出该方法的返回值
       Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
       // String r = (String) response[0];
       WsUpdateAlertRes r = (WsUpdateAlertRes) response[0];
       System.out.println(r);

    } catch (AxisFault e) {
       e.printStackTrace();
    }
}

public static void main(String[] args) {
    WsClient.testRPCClient();
}

}

目前遇到的问题,就是入参,在服务端接受入参为null为空。以下是入参对象
public class WsUpdateAlertReq implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private long alertCode;

private int alertType;

public long getAlertCode() {
    return alertCode;
}

public void setAlertCode(long alertCode) {
    this.alertCode = alertCode;
}

public int getAlertType() {
    return alertType;
}

public void setAlertType(int alertType) {
    this.alertType = alertType;
}

}

2 回复

webservice就乖乖用普通类型好了

复杂类型不能调用吗?

添加回复
请先登陆
回到顶部