这里以apache-cxf-2.4.3为例:
首先使用工具生成代码
第一步: 简述CXF 流程
第一步:通过自定义的WEB服务接口生成WSDL描述性文档。
第二步:通过WSDL描述性文档生成WEBSERVICE服务端和客户端。
步骤一:
在应用CXF前,要知道CXF有哪些作用;
1. 服务端
在我们利用CXF编写webservice服务端时,首先明白CXF时根据你自己定义的接口来生成WSDL文件,此WSDL文件的作用为生成Webservice 服务端代码(此WSDL文件不是最终发布的WSDL文件,最终发布的文件是根据程序生成);然后根据生成的WSDL文件来生成服务端代码(在生成版本的问题会产生版本问题,在报错的代码中会提示你生成的代码加入
//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.
);根据生成相应的代码来调用你业务相应的操作;
(需要注意的是:根据Interface来生成WSDL,要想生成的WSDL会详细的展示接口定义的参数的属性的名称需要在接口中指定类@WebService(name="SAPOperationInterface",targetNamespace = "http://test.com/")
方法@WebMethod(operationName="acceptBrandInfo")
参数@WebParam(name="brandcode")!如果不指定的话,生成的参数会为arg0,arg1等问题);
还有个问题就是要在生成的代码中取掉,wsdlLocation = "file:/D:/Tools/WorkSpace/MyProject/*.wsdl",
因为这是你自己本地的文件,优先级比较高,但当你提交代码,服务器上没有你的文件,所以又可能报错
2. 客服端
在我们编写客服端的时候,可以根据相应的服务端给我们的WSDL文件来生成
客服端代码(这种情况适合于返回的为复杂类型,如:对象,List等),同样也可以用CXF提供的工厂类来操作(这种情况适合简单类型,如:String,int等);
步骤二:
l 首先下载apache-cxf-2.4.3组件包,并解压,可以把CXF配置到环境变量中
l 新建java project,创建一个JAVA类,并写入如下代码
public class TestMain {
public static void main(Stringargs[]){
JavaToWS.main(
new String[]{"-o","WsTest.wsdl","-wsdl","com.cxfinterface.WsInterFace"})
}
}
注:其中“-o”是固定参数,“WsTest.wsdl”是要发布的WSDL文件,“-wsdl”固定,“com.cxfinterface.WsInterFace”是定义要发布的服务接口。
l Run上面的JAVA类,会在工程目录下生成一个WSDL文件。
步骤三:
l 使用JAVA命令将WSDL描述文档生成对应的JAVA类,命令使用如下:
wsdl2java -p com.cxfserver -d src –all aa.wsdl
注:此处不要用 –all 如果生成服务端用-impl ,客服端可以用-client等(在生成代码时,要明确生成哪方面的代码,避免用-all,范例先用-all表示)
-p 需要生成文件所在的包名
-d 文件生成后存放的路径
-all 生成所有文件(此处可以为Impl , Server , Client等操作,要根据你相应的操作来设定)
举个例子:
wsdl2java -p com.test -d E:\temp -all E:\ATG\WsTest.wsdl
对应E:\ATG\WsTest.wsdl文件生成一个服务端,包名为com.test,生成后文件存放在E:\temp
注:文后附属命令其他参数含义,更多具体可参考apache官方文档
l 将生成后的文件拷贝到对应的包目录下
到此为止,CXF工具生成WEBSERVICE代码就结束了
但本身CXF与Spring是耦合的,我们需要对其进行解耦;
下面将CXF从SPRING中解偶,具体是重写org.apache.cxf.transport.servlet.CXFNonSpringServlet;这个类
至于为什么这么重写,我只是简单看过,没有分析内部,有兴趣的可以自己分析,另外这个例子中只绑定发布了一个方法,需要同时发布多个方法提供公用接口的童鞋,可以自己琢磨下。