使用axis调用webservice时 服务端接收到的参数为null

wawangzhihai 2013-05-08 02:02:17
如题,我的webservice是在myeclipse 10下基于JAX-WS的WebService开发的,过程如下链接:http://www.cnblogs.com/alden/archive/2012/02/08/2343208.html
发布的时候使用Tomcat 7,可以正常访问

服务端的代码如下:

package cn.com.wzh;

public class main {
public String callService(String TransNo, String Inxml) {
if ("test".equals(TransNo)) {
return "success:**" + TransNo + "***" + Inxml;
}
return "fault:**"+TransNo + "***" + Inxml;
}
}


用tomcat发布webservice时没有异常,信息如下:

2013-5-8 1:46:25 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\apache-tomcat-7.0.39\webapps\zq
2013-5-8 1:46:28 com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextInitialized
信息: WSSERVLET12: JAX-WS context listener initializing
2013-5-8 1:46:34 com.sun.xml.ws.transport.http.servlet.WSServletDelegate <init>
信息: WSSERVLET14: JAX-WS servlet initializing



客户端是新建一个webproject,新建一个java文件,导入的包如下:

axis.jar,commons-discovery-0.2.jar,commons-logging-1.0.4.jar,wsdl4j-1.5.1.jar

其中test.java代码如下:

import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class test {
public static void main(String[] arg) {
String url = "http://192.168.153.1:8080/zq/mainPort";
String TransNo = "test";
String Inxml = "";
String namespace = "http://wzh.com.cn/";
try {
Service service = new Service();
Call call = (Call) service.createCall();
// 设置调用服务地址
call.setTargetEndpointAddress(new java.net.URL(url));
// 此处一定要配置wsdl的namespace参数http://www.hua-xia.com.cn/ZySearch
call.setOperationName(new QName(namespace, "callService"));

// 此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为null
call.addParameter(new QName(namespace, "TransNo"),
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.addParameter(new QName(namespace, "Inxml"),
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
// 如果设置类传入参数类型,此处也需要设置返回参数类型
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
call.setUseSOAPAction(true);
call.setSOAPActionURI(url);
String result = (String) call
.invoke(new Object[] { TransNo, Inxml });
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}


使用以上代码调用时候是可以调通的,但是服务端接收的参数的值为null,打印的值如下
fault:**null***null

如果按照上面的链接的客户端开发,是可以正常调用,参数的值也有

麻烦各位帮我看看是什么原因,纠结了半天了
...全文
15598 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
向下生长的花 2016-01-28
  • 打赏
  • 举报
回复
特意上来感谢 rockcoder ,这个问题也坑我好几天了 感谢感谢!!!
asd1685 2015-09-16
  • 打赏
  • 举报
回复
特意上来感谢 rockcoder ,这个问题坑我好几天了 感谢感谢!!!
huathe 2015-08-25
  • 打赏
  • 举报
回复 1
原来是参数名称得匹配jws服务端注解的参数名称。
huathe 2015-08-25
  • 打赏
  • 举报
回复
郁闷,我这边设置arg0不好用,设置为requestXmlStr才传递成功的。
BrightFireOfCy 2015-01-27
  • 打赏
  • 举报
回复
比如说有下面这样一个java class,想把里面的helloworld发布成webservice class WhatEver { public int helloworld(String w1, String w2) { System.out.println("hello world. " + w1); return w1.length;} } 我们期望的xsd是下面这样的 <schema targetNamespaces="....." .........> <element name="helloworld"> <element name="w1" type="XXX:string" /> <element name="w2" type="XXX:string" /> </element> .................... </schema> 但是真正生成的是下面这样的 <schema targetNamespaces="....." .........> <element name="helloworld"> <xs:any/> </element> .................... </schema> 所以,当你不知道某个工具的具体行为的时候,就不要用那个工具,老老实实自己做 这也是所谓的"手动组装"存在的意义之一
BrightFireOfCy 2015-01-27
  • 打赏
  • 举报
回复
引用 16 楼 bian2014 的回复:
你们有没有考虑为什么服务端的参数好端端的变为arg0-arg9呢,求指教,参数变了很不好啊。服务端需要写什么来解决这个问题啊
问题出在从java的类转换成wsdl的时候,有些java的工具默认状态下不会根据java类里的方法的参数名生成<wsdl:types>块里对应的参数节点,而是图省事直接生成一个xsd的<any>节点
Giberson1 2015-01-09
  • 打赏
  • 举报
回复
引用 16 楼 bian2014 的回复:
你们有没有考虑为什么服务端的参数好端端的变为arg0-arg9呢,求指教,参数变了很不好啊。服务端需要写什么来解决这个问题啊
我也碰到了这个问题,后来自己看看了wsdl的配置文件解决了。 方法如下: 到 WebRoot/WEB-INF/wsdl下,找到你项目对应的****.xsd文件,将其中arg0-arg9改成您对应的接口参数名。
bian2014 2015-01-05
  • 打赏
  • 举报
回复
你们有没有考虑为什么服务端的参数好端端的变为arg0-arg9呢,求指教,参数变了很不好啊。服务端需要写什么来解决这个问题啊
wumingsanren 2014-12-30
  • 打赏
  • 举报
回复
感谢rockcoder,,确实解决了。
高长凯 2014-12-05
  • 打赏
  • 举报
回复
引用 9 楼 rockcoder 的回复:
结合SoapUI分析发现,如果jws通过annotation来发布,或者类似方式,通过axis调用,需要注意两点: 1)在call.setOperationName是必须通过Qname来制定namespaceURI 2)在设定参数时,不使用服务端定义的参数名,而是arg0~argN来定义,也不需制定namespaceURI,上述代码 call.addParameter(new QName(namespace, "TransNo"), XMLType.XSD_STRING, ParameterMode.IN); 修改为 call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN); 有几个参数,即设定几个。 提供参考,可测试试验一下。
感谢。。。
usernamehui 2014-11-04
  • 打赏
  • 举报
回复
感谢 rockcoder 。。。
低调的可爱 2014-10-13
  • 打赏
  • 举报
回复
怎么解决的这个问题,可以帮帮忙吗
ChinaOneCup 2014-10-08
  • 打赏
  • 举报
回复
用SoapUI工具进行分析,能看到该怎样传参数 还有用HTTPAnalyzerFull工具可以进行抓包,看看提交和返回的是什么内容 不管是.net 调用java或者Java调用.net,一般用以上两个工具都能解决问题
ddongymz 2014-09-28
  • 打赏
  • 举报
回复
果然如 rockcoder 所说,是参数名字的问题 。不能用真是的参数名字 要用 arg0 ,arg1。。。arg0N 按照顺序。再次感谢rockcoder
rockcoder 2014-08-20
  • 打赏
  • 举报
回复 17
结合SoapUI分析发现,如果jws通过annotation来发布,或者类似方式,通过axis调用,需要注意两点: 1)在call.setOperationName是必须通过Qname来制定namespaceURI 2)在设定参数时,不使用服务端定义的参数名,而是arg0~argN来定义,也不需制定namespaceURI,上述代码 call.addParameter(new QName(namespace, "TransNo"), XMLType.XSD_STRING, ParameterMode.IN); 修改为 call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN); 有几个参数,即设定几个。 提供参考,可测试试验一下。
  • 打赏
  • 举报
回复
楼主解决了吗
BrightFireOfCy 2014-07-24
  • 打赏
  • 举报
回复
引用 1 楼 fangxinggood 的回复:
axis 开发太麻烦。建议用 cxf。 另外eclipse里默认有 axis webservice client 生成工具,输入wsdl就能生成客户端代理的。 何必用这种方式。 这种手动组装调用WebService的方式是对wsdl的浪费。
哥哥,你见过开发机不能上网,并且除了j2ee的那几个包外不能用所有其他包的项目吗? 见过就知道为啥要受冻组装了。
ximenwuji 2014-07-24
  • 打赏
  • 举报
回复
调用webservice接口,java竟然这么麻烦,不知道java的IDE开发环境为啥不升级?
z289747400 2014-07-22
  • 打赏
  • 举报
回复
楼主解决了吗?我前几天做也遇到这样的问题,安卓客户端 调我的java jaxws服务端,调用无参数时,正常。调用有参数时,就传入null
  • 打赏
  • 举报
回复
你问的问题跟.net有关吗?
加载更多回复(3)

12,162

社区成员

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

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