工作需要,调用一个项目的接口,原本采用的是wsimport 命令的方式。但是后来发现,如果服务在windows上,一切正常,可以调用到接口。但是如果服务在Linux上,调用接口会报 "在文档的元素内容中找到无效的 XML 字符 (Unicode: 0x0)".网上说是接口返回的xml的字符集有问题。折腾了半天都搞不定。
后面换一种eclipse自带的生成webService Client的方式,来调用接口,但是也有问题。
第2种:webService Client方式。
第一步:新建Java项目。
第二步:select a wizard新建WebService Client 代码,这里需要正确的http://192.168.1.251:8180/TestProject/services/ws/DSMAuth?wsdl
第三步:测试生成的代码。
问题点:以上可以正常测试,但是当我部署到Tomcat上面的时候,报“ org.apache.commons.discovery.DiscoveryException: No implementation defined for org.apache.commons.logging.LogFactory“错误。说是没有实现log记录方式。但是我明明有放log的jar包进去。所有这种方式也放弃了。如果有人解决,请多多指教留言,谢谢哈。 因为这种方式不行,后面只能再想办法。突然有个灵感,用wsimport方法生成的代码,调用接口报xml字符有问题,那如果我返回String字符串是不是就没问题了呢。以下是用最终的方法。
第1种方法:
第一步:1、借助wsimport命令工具自动生成客户端代码
打开命令行窗口,切换到项目的src目录,执行"wsimport -keep http://192.168.1.251:8180/Testproject/services/ws/DSMAuth?wsdl"生成客户端代码,如下图所示:
这样就会生成代码到WebService_Wsimport/src目录下。
第二步:新建测试类,main方法里面书写如下。
//创建WSDL的URL,注意不是服务地址
URL url=null;
try {
url = new URL(urlStr);
} catch (Exception e) {
System.out.println("接口的url访问出错!!");
}
//创建服务名称
QName qname = new QName("http://ws.lddsm.com", "DSMAuth");
Service service = Service.create(url, qname);
// //调用查询方法
String result=null;
try {
// //获取服务实现类
DSMAuth authService = service.getPort(DSMAuth.class);
result = authService.getRegisterInfoNew(null);
} catch (Exception e) {
System.out.println("调用接口失败!");
}
return result;
问题:上面这句authService.getRegisterInfoNew(null);原先返回的是一个类,后面改成返回String,就不会报XML字符问题了。