首先说下有两种方式生成wsdl客户端代码:
1.通过Apache cxf 的wsdl2java生成
1).先下载apace cxf包,配置环境变量,和java 的环境变量的配置方式一样。
在环境变量中配置CXF_HOME 值为D:\cxf\apache-cxf-3.0.0,在PATH中加入%CXF_HOME%\bin
验证环境变量有无配置成功,cmd 窗口,输入 wsdl2java
2).wsdl2java用法:
wsdl2java -p com -d src -all 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.
实例指定的生成目录是 D盘下src目录:wsdl2java -p com -d d:/src -client http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
跟新问题:
今天遇到了一个问题,生成的实体类中的字符串属性,多了一个参数类型 protected JAXBElement
经过查找,需要在生成的时候控制一下生成的文件,步骤:
1.先在本地中创建1.txt 文本内容(我在c盘根目录下),放置的位置好像没有关系。文本中放入
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
2. 在cmd中执行命令
wsdl2java -p com.wang.provider.SyncResult -d d:/src -b "1.txt" -client http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
大体解释下意思:-p 后面是要生成的代码的包名, -d 后面指的是生成代码所在的目录,d盘src 下,-b 绑定文件的名称
一个月后又遇到了新的问题,当在再次使用时,我先cmd 输入wsdl2java -v验证一下,竟然报错是 java.lang.illegalargumentexception: uri is not hierarchical 搞不懂了。环境变量之前就配置了,后来在环境变量中我又重新选择了CXF 的路径,就好了
2.通过soapui 工具生成wsdl 客户端代码
问题:
1.Running Apache CXF wsdl2java for [SOAPEventSourceBinding]
directory: C:\Program Files\apache-cxf-3.1.10\bin
command: [cmd.exe, /C, wsdl2java.bat, -d, D:\wsdl, -exsh, false, -dns, true, -dex, true, -verbose, C:\Users\Admin\AppData\Local\Temp\tempdir17737533249299.tmp\xxxxxxxxxxxxxxxxxxxxImplService_1.wsdl]
文件名、目录名或卷标语法不正确。
出现这个问题是因为JAVA_HOME 有两个值,配置了两个jdk
2.
Running Apache CXF wsdl2java
directory: C:\Program Files\apache-cxf-3.1.10\bin
command: [cmd.exe, /C, wsdl2java.bat, -d, D:\wsdl, -client, -exsh, false, -dns, true, -dex, true, -verbose, http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx]
java.lang.UnsupportedClassVersionError: org/apache/cxf/tools/wsdlto/WSDLToJava : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: org.apache.cxf.tools.wsdlto.WSDLToJava. Program will exit.
Exception in thread "main"
官网上是这样写的apache cxf 的3.1 的版本时不支持jdk1.6 的,需要jdk1.7以上,包含1.7 版本:The current plan is that CXF 3.1 will no longer support Java 6 and will require Java 7 or newer. Users are strongly encouraged to start moving to Java 7.
3.今天使用cmd窗口编译soapui生成wsdl的客户端代码时,出现了异常,异常信息如:(jdk1.6 版本编译):
于是就去找这个没有编译成功的Java类,发现59是这样子的:
public SendMail(WebServiceFeature ... features) {
super(WSDL_LOCATION, SERVICE, features);
}
public SendMail(URL wsdlLocation, WebServiceFeature ... features) {
super(wsdlLocation, SERVICE, features);
}
public SendMail(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) {
super(wsdlLocation, serviceName, features);
}
经过百度看到文章说是:不能正常编译通过是由于jax-ws2.2规约与java6冲突 需要降低jax-ws规约版本;
解决方法:在生成的时候服务路径前面加上 -frontend jaxws21
于是我不使用soapui而是通过wsdl2java 命令行生成 代码,于是就有了下面的命令:
wsdl2java -frontend jaxws21 -p com.service.webservice.mail.client -d c:/com -client http://xxx.xx.xx/support/sendMail?wsdl
然后在使用jdk1.6 编译Java代码,这次编译成功。。。