java调用WSDL出问题

你也叫风语者 2016-12-01 08:53:50
江湖救急!

java调用WSDL出问题
java调用

import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class CallWsdl {

public static void main(String[] args) {

try {

// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/tiger/wstiger/TraderService?wsdl");
options.setTo(targetEPR);
// 指定sayHelloToPerson方法的参数值
Object[] opAddEntryArgs = new Object[] {"2c90817157ffd27f0157ffd9943a0171"};
// 指定sayHelloToPerson方法返回值的数据类型的Class对象
Class[] classes = new Class[] {String.class};
// 指定要调用的sayHelloToPerson方法及WSDL文件的命名空间
QName opAddEntry = new QName("http://service.ws.tiger.com", "getTraderInfo");
// 调用sayHelloToPerson方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
} catch (Exception e) {
e.printStackTrace();
}

}

}

服务器端

@WebService(targetNamespace="http://service.ws.tiger.com")
public interface TraderService {

public String getTraderInfo(@WebParam(name="usercode",targetNamespace = "http://service.ws.tiger.com") String usercode) throws Exception;

}


================================================
报错
org.apache.axis2.AxisFault: Unmarshalling Error: unexpected element (uri:"", local:"arg0"). Expected elements are <{http://service.ws.tiger.com}usercode>
at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:531)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:375)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:555)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:531)
at org.apache.axis2.rpc.client.RPCServiceClient.invokeBlocking(RPCServiceClient.java:102)
at com.visitor.CallWsdl.main(CallWsdl.java:60)

服务器端被其他程序调用是正常的,服务器端应该没问题。

感谢大家!
...全文
225 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
你也叫风语者 2016-12-02
  • 打赏
  • 举报
回复
用这个方式调用成功了

URL wsUrl = new URL("http://localhost:8080/tiger/wstiger/TraderService?wsdl");
	            
	            HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection();
	            
	            conn.setDoInput(true);
	            conn.setDoOutput(true);
	            conn.setRequestMethod("POST");
	            conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
	            
	            OutputStream os = conn.getOutputStream();
	            
	            //请求体
	            String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"  xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + 
	                          "<soapenv:Body> <getTraderInfo xmlns=\"http://service.ws.tiger.com\"><usercode>2c90817157ffd27f0157ffd9943a0171</usercode>  </getTraderInfo> </soapenv:Body> </soapenv:Envelope>";
	            
	            os.write(soap.getBytes());
	            
	            InputStream is = conn.getInputStream();
	            
	            byte[] b = new byte[1024];
	            int len = 0;
	            String s = "";
	            while((len = is.read(b)) != -1){
	                String ss = new String(b,0,len,"UTF-8");
	                s += ss;
	            }
	            System.out.println(s);
	            
	            is.close();
	            os.close();
	            conn.disconnect();
你也叫风语者 2016-12-02
  • 打赏
  • 举报
回复
引用 1 楼 zyz1985 的回复:
改用接口的方式调用,RPCServiceClient有一定局限性,就目前的信息是客户端调用时只传递了参数值没有名称系统默认“arg0”,但是服务器要求参数名称为usercode,要么弃用arg0,要么服务端弃用@WebParam
感谢! 我换了一个方式,使用SOAP调用的。
游一游走一走 2016-12-01
  • 打赏
  • 举报
回复
改用接口的方式调用,RPCServiceClient有一定局限性,就目前的信息是客户端调用时只传递了参数值没有名称系统默认“arg0”,但是服务器要求参数名称为usercode,要么弃用arg0,要么服务端弃用@WebParam

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧