CXF 生成客户端代码
详情参见:
ECLIPSE+CXF http://blog.csdn.net/segen_jaa/article/details/12947305点击打开链接
设置环境变量
set CXF_HOME=D:\apache-cxf-2.3.5 //设置cxf根目录,此步可省
set JAVA_HOME=D:\Java\jdk1.6.0//设置jdk 目录
客户端生成
1、先下载cxf包
http://cxf.apache.org/download.html,现在cxf包。点击打开链接
2、解压缩包,通过cmd命令进入到bin目录下
然后命令生成 :wsdl2java -p 包名 -d 生成文件存放的目录(必须存在) -client http://IP:端
口/XX/XXService?wsdl
-p不指定时会根据名称空间自动生成,所以一般不指定
cxf会自动生成clent示例代码
比较:
JDK生成客户端
wsimport -d /workspace/webservice/ -keep -verbose http://IP:端口/XX/XXService?wsdl
举例:--常用命令(天气)
wsdl2java -p com.xiangyang.weather.service.impl.client
?
常用命令
-d F:\webservice -client http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
?
?
注意:
-------------------------------------------------------------------------------------------------------
生成的客户端有时候在框架类调用父类的构造函数时会报错
如:
CheckI****Service
public CheckI****ServicePortType getCheckI****ServiceHttpPort(WebServiceFeature... features) {
return super.getPort(CheckI****ServiceHttpPort, CheckI****ServicePortType.class, features);
}
报错的原因为jax-ws2.2规约与java6冲突 故需要降低jax-ws规约版本
解决办法是在生成的命令中加入-frontend jaxws21
加入后命令如下: wsdl2java -frontend jaxws21 -d E:\zkr\project\client\src -client d:/Test.wsdl
通过java调用.net生成的wsdl时,需要将wsdl文件中的<s:element ref="s:schema" ></s:element><s:any ></s:any> 替换为 <s:any minOccurs="2" maxOccurs="2" ></s:any>
1.在浏览器中打开webservice url,保存wsdl文件,如ContentService.xml
2.通过cxf命令“wsdl2java –d E:/file –frontend jaxws21 –client C:\ ContentService.xml”生成客户端代码
3.若报WSDLToJava Error: Thrown by JAXB : undefined simple or complex type 'soap-enc:Array' ,
则需要在生成的文件中找到
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />,
在浏览器中打开http://schemas.xmlsoap.org/soap/encoding/,
保存文件soap-encoding.xsd,
然后修改成<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="soap-encoding.xsd"/>,
再运行上面的命令即可。
4.如果需要NTLM认证,则需在代码中加入如下的代码:
Java代码 收藏代码
Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
http.setClient(httpClientPolicy);
http.getAuthorization().setAuthorizationType("NTLM");
http.getAuthorization().setUserName("xxxx");
http.getAuthorization().setPassword("xxxxx");
------------------------------------------------------------------------------------------------------
简单调用示例:
public static void main(String[] args) {
OpenApupProductService iApupProductService = new OpenApupProductServiceImplService().getOpenApupProductServiceImplPort();
ApupProductAll apa=iApupProductService.getProduct("NET001bba5ba711f3247a78a2693783dfe4fba");
System.out.println(apa.getApupProduct().getValue().getPid().getValue());
}