CXF应用wsdl2java生成客户端super报错的解决
CXF使用wsdl2java生成客户端super报错的解决
长时间不写东西,慢慢的觉得脱离了学习的轨道。我要记住学习中遇到的每一点问题。
CXF很久没有用过,但却并不陌生,异常不可避免。这次是用CXF自带bat工具生成客户端测试代码。
首先,下载CXF包,并将其目录下的bin添加到系统的path中。dos下运行wsdl2java 不会出现找不到命令的错误,表示配置成功。
然后,进入到wsdl文件所在目录,执行 wsdl2java -client *.xml 命令,正常执行。
再次,将wsdl文件同级目录下生成的客户端测试代码和wsdl文件都copy到工程中,编译时异常出现了。继承Service的类构造器有error,不能被正常编译。
这是三个报错的构造函数(请认真看注释描述):
//This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2 //API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1 //compliant code instead. public IcpBusinessService(WebServiceFeature ... features) { super(WSDL_LOCATION, SERVICE, features); } //This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2 //API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1 //compliant code instead. public IcpBusinessService(URL wsdlLocation, WebServiceFeature ... features) { super(wsdlLocation, SERVICE, features); } //This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2 //API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1 //compliant code instead. public IcpBusinessService(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) { super(wsdlLocation, serviceName, features); }
原因请参见:http://cxf.apache.org/docs/23-migration-guide.html 官方说明。
怎么解决呢? 经过研究发现,其不能正常编译通过是由于jax-ws2.2规约与java6冲突。 但程序又不能仅以java5来编译,故需要降低jax-ws规约版本,可以这样处理: 执行命令
wsdl2java -frontend jaxws21 -client *.xml
这样以jax-ws2.1生成的代码就可以在java6中编译通过并可执行。修改 *_Client.java,这个是测试的主方法,录入参数执行,即可调用远程服务.
注:我将这两次生成的客户端代码进行比较,唯一的区别就是用后者生成的客户端代码将报错的3个构造函数移除了。也就是说,我们只需要将这3个出错的构造器删除就可以处理此异常。
over.
1 楼
sleepingxu
2012-05-08
刚好也遇到这个问题,谢谢分享
2 楼
nut1018
2012-06-08
恩,碰到了同样的问题,确实是这样的,cxf2.3.6有这个问题,2.1.5生成的没这个问题