使用Apache CXF根据wsdl文件生成代码
Posted congcongdi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Apache CXF根据wsdl文件生成代码相关的知识,希望对你有一定的参考价值。
1、去官网下载,我用的是apache-cxf-2.5.10.zip
2、解压
3.通过命令行进入Apache CXF的bin目录,如我的目录是D:\\BIS\\axis2\\apache-cxf-2.7.10\\bin
(此目录为wsdl2java.bat 所在的目录(如果不是, 要写 .bat 所在的全路径))
4.输入命令:
wsdl2java.bat -p com.oscar999 -client -encoding utf-8 -noAddressBinding wsdl文件
说明:
wsdl2java用法:
wsdl2java -p com -d src -all aa.wsdl
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码 (-encoding utf-8生成中文进行utf-8编码)
-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.
5.如果在eclipse 测试的话, 可以新建 一个java project, 把cxf lib 下所有的 jar 拷入到 项目的lib 路径下, 并放入build path 中。
然后把产生的java 文件,拷入到src 中就可以调用测试了。
可能遇到的问题:
(一)、
Caused by: org.xml.sax.SAXParseException; systemId: jar:file:/D:/apache-cxf-2.7.11/apache-cxf-2.7.11/lib/jaxb-xjc2.2.6.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: 由于 accessExternalSchema 属性设置的限制而不允许 \'file\' 访问, 因此无法读取方案文档 \'xjc.xsd\'。
在网上百度了下,看了大神给出的解决方案,顿时明白了。
1、首先分析错误的原因:
本人使用的jdk和jre版本都是1.8,使用的cxf版本是apache-cxf-2.7.11,网上大神说这里是由于jdk1.8的一个bug,具体详情https://bugs.openjdk.java.net/browse/JDK-8020999;
2、解决方案:
在jdk的安装路径下,我的是 C:\\Java\\jdk1.8.0_65\\jre\\lib,添加一个属性文件jaxp.properties,并写上如下内容javax.xml.accessExternalSchema = all
(二)、关于cxf生成客户端代码中的JAXBElement<String>
在使用cxf或者x-fire进行webservice开发时,从wsdl文件生成客户端代码时,如果有属性的类型是String,可能会出现JAXBElement<String>类型。
为什么webservice客户端不直接使用String,而使用JAXBElement<String>类型,自然是有原因的,是因为服务器端的wsdl文件有nillable="true"这个属性。
解决办法:使用wsdl2java.bat -b "1.txt" -client -d E:/tmp -frontend jaxws21 wsdl文件,就可以生成正常的pojo类
“1.txt”内容如下:
<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>
以上是关于使用Apache CXF根据wsdl文件生成代码的主要内容,如果未能解决你的问题,请参考以下文章