根据wsdl接口,通过Apache cxf 生成wsdljava客户端代码,过程中出现的问题记录

首先说下有两种方式生成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<String> address;导致调用属性时有问题。
经过查找,需要在生成的时候控制一下生成的文件,步骤:
1.先在本地中创建1.txt 文本内容(我在c盘根目录下),放置的位置好像没有关系。文本中放入
<jaxb:bindings version="2.1"   
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"   
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"   
xmlns:xs="http://www.w3.org/2001/XMLSchema">   
   <jaxb:globalBindings generateElementProperty="false"/>   
</jaxb:bindings> 
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 客户端代码

 

扫描二维码关注公众号,回复: 6408790 查看本文章

问题:
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 版本编译):

  • C:\Program Files\Java\jdk1.6.0_45\bin>javac C:\com\com\bizenit\idm\sim\service\webservice\mail\client\*.java
  • C:\com\com\bizenit\idm\sim\service\webservice\mail\client\SendMail.java:51: 找不到符号
  • 符号: 构造函数 Service(java.net.URL,javax.xml.namespace.QName,javax.xml.ws.WebServiceFeature[])
  • 位置: 类 javax.xml.ws.Service
  •         super(WSDL_LOCATION, SERVICE, features);
  •         ^
  • C:\com\com\bizenit\idm\sim\service\webservice\mail\client\SendMail.java:55: 找不到符号
  • 符号: 构造函数 Service(java.net.URL,javax.xml.namespace.QName,javax.xml.ws.WebServiceFeature[])
  • 位置: 类 javax.xml.ws.Service
  •         super(wsdlLocation, SERVICE, features);
  •         ^
  • C:\com\com\bizenit\idm\sim\service\webservice\mail\client\SendMail.java:59: 找不到符号
  • 符号: 构造函数 Service(java.net.URL,javax.xml.namespace.QName,javax.xml.ws.WebServiceFeature[])
  • 位置: 类 javax.xml.ws.Service
  •         super(wsdlLocation, serviceName, features);

于是就去找这个没有编译成功的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代码,这次编译成功。。。

猜你喜欢

转载自blog.csdn.net/panshoujia/article/details/78899160