将schema从cxf产生的wsdl分离

5月 26, 2015 |

demo 下载:testcxf-java2ws.zip

对于代码优先的web service开发,cxf默认将所有的元素都产生在wsdl文件中,导致文件很庞大,而且相同的schema对象会在每个wsdl中有一份,但是cxf提供了强大的tool支持,只需要简单的几步,我们就可以将schema 定义从wsdl中分离出来,具体的步骤为:
一、创建一个SPE对象(就是一个带@WebService注解的接口)

相关的注释解释如下:
@WebService 表示这是一个web service, targetNamespace对应产生的<wsdl:definitions targetNamespace="">,
serviceName我们希望的服务名, 对应<wsdl:service name>
portName 对应<wsdl:port name="">
wsdlLocation指定wsdl文件的位置,我们下一步产生这个文件

二,使用java2ws产生对应的wsdl和xsd文件
1、java2ws是cxf开发工具包中的一个tool, 可以在http://cxf.apache.org/docs/interceptors.html地方下载最新的版本。
2、先将工程编译,产生HelloWorld.java对应的HelloWorld.calss文件
3、cd testcxf-java2ws\src\main\java 目录
4、java2ws -createxsdimports -wsdl -o HelloWorld.wsdl -d ../resources/ -cp "D:\Ted\TEST\testcxf-java2ws\target\testcxf-java2ws\WEB-INF\classes" -server -client cn.javacoder.testcxf.java2ws.HelloWorld
相关的选项解释如下:
-createxsdimports 产生的wsdl和xsd分离
-wsdl -o HelloWorld.wsdl  表示产生名为HelloWorld.wsdl的wsdl文件
-d ../resources/ 产生的wsdl和xsd文件的输出位置
-cp "D:\Ted\TEST\testcxf-java2ws\target\testcxf-java2ws\WEB-INF\classes" 指定我们的HelloWorld.calss classpath
-server -client 产生客户端和服务端的测试代码
执行完成后的目录结构如下:
cxf-wsdl-xsd-depart
5、注意点:
1)java2ws
为我们产生了HelloWorldImpl.java文件,是服务的实现框架。我们需要将其上的@WebService注释去掉,否则当用户请求"http://localhost:9090/HelloWorldPort?wsdl"时看到的还是wsdl和xsd在一起的版本。
2)可能是java2ws的一个小瑕疵,我们制定了"@WebParam(name="user") User user", 但是HelloWorldImpl.java文件的参数名还是为arg0, 不喜欢可以手工改动。
6、按照你的逻辑修改HelloWorldImpl.java和HelloWorldClient.java文件,
7、分别启动服务器端和客服端。哈哈,完美!

三、让cxf输出请求参数和响应参数
1)在java2ws自动产生的HelloWorldServer文件中添加如下行:
BusFactory.getDefaultBus().getInInterceptors().add(new org.apache.cxf.interceptor.LoggingInInterceptor());
2)增加jvm参数 "-Dorg.apache.cxf.Logger=org.apache.cxf.common.logging.Log4jLogger" 这个的设置参考我的上一篇博客《使用CXF整合Spring开发web service》
3)在classpath路径中提供log4j.properties文件
具体参考http://cxf.apache.org/docs/interceptors.html

Posted in: cxf, 开源项目 | Tags: , ,

Comments are closed.