使用CXF开发Web Service服务端需要两部分:接口和实现类
步骤:
1、开发一个Web Service 业务接口,该接口需要用@WebService注解
2、开发一个Web Service实现类,实现类也需要用@WebService注解
3、添加Jar包,并发布WebService
具体步骤如下:
1、新建Java项目即可,我们用CXF内置的Jetty服务器
2、开发业务接口:
package com.onyas.ws.cxf;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(String name);
}
3、开发实现类
package com.onyas.ws.cxf.impl;
import java.util.Date;
import javax.jws.WebService;
import com.onyas.ws.cxf.HelloWorld;
@WebService(endpointInterface = "com.onyas.ws.cxf.HelloWorld"
,serviceName = "HelloWorldWs")
public class HelloWorldWs implements HelloWorld {
@Override
public String sayHi(String name) {
return "Hello " + name+new Date();
}
}
4、添加Jar包:
这个教程所用的CXF版本为2.7.9,所需要的jar包请看源代码,在最后附有源代码的下载地址,所有cxf版本的下载地址
5、发布服务端:
package onyas;
import javax.xml.ws.Endpoint;
import com.onyas.ws.cxf.HelloWorld;
import com.onyas.ws.cxf.impl.HelloWorldWs;
public class ServerMain {
public static void main(String[] args) {
HelloWorld hw = new HelloWorldWs();
Endpoint.publish("http://127.0.0.1:9999/onyasWS", hw);
System.out.println("WebService已成功发布");
}
}
注意运行服务端以后,不要关在闭服务端
6、打开浏览器,到你所发布的地址去验证,是否发布成功,本教程所发布的地址为:http://127.0.0.1:9999/onyasWS?wsdl,进入这个地址,如果所呈现的结果如下图所示,刚发布成功
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.cxf.ws.onyas.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://cxf.ws.onyas.com/" name="HelloWorldWs" targetNamespace="http://impl.cxf.ws.onyas.com/">
<wsdl:import location="http://localhost:9999/onyasWS?wsdl=HelloWorld.wsdl" namespace="http://cxf.ws.onyas.com/" />
- <wsdl:binding name="HelloWorldWsSoapBinding" type="ns1:HelloWorld">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="sayHi">
<soap:operation soapAction="" style="document" />
- <wsdl:input name="sayHi">
<soap:body use="literal" />
</wsdl:input>
- <wsdl:output name="sayHiResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="HelloWorldWs">
- <wsdl:port binding="tns:HelloWorldWsSoapBinding" name="HelloWorldWsPort">
<soap:address location="http://localhost:9999/onyasWS" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
服务端开发完毕
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
使用CXF开发Web Service客户端:
1、新建Java项目
2、进入到客户端项目的src目录中,调用CXF提供的wsdl2java工具(把下载的cxf目录下的bin目录配置到path环境变量中),根据WSDL文档生成相应的代码,因为任何语言实现的Web Service,都需要提供并暴露WSDL文档,就是上文所发布的那个地址。
也就是如下:F:\myworkspace\Cxf_Client\src> wsdl2java -frontend jaxws21 http://localhost:9999/onyasWS?wsdl
3、找到wsdl2java所生成的类中,一个继承了Service的类,该类的实例可以当成工厂类来使用。
4、调用Service子类的实例getXXXXport方法,返回远程Web Service的代理。
代码如下所示:
package onyas;
import com.onyas.ws.cxf.HelloWorld;
import com.onyas.ws.cxf.impl.HelloWorldWs;
public class ClentMain {
public static void main(String[] args) {
HelloWorldWs factory = new HelloWorldWs();
//此处返回的只是远程Web Service的代理
HelloWorld hw = factory.getHelloWorldWsPort();
System.out.println(hw.sayHi("Test"));
}
}
5、运行客户端,如果显示“Hello TestFri May 02 13:42:20 CST 2014”,表示运行成功
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
可能出现的错误:
cxf在客户端调用时报这个错误:
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Cannot create a secure XMLInputFactory
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:171)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:94)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:240)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:210)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:103)
at $Proxy29.sayHi(Unknown Source)
at onyas.ClentMain.main(ClentMain.java:13)
同时cxf在服务端报这个错误:
java.lang.RuntimeException: Cannot create a secure XMLInputFactory
解决办法:
原因是少了一个叫woodstox-core-asl-4.2.0.jar的jar包,添加该jar包,并加到add to build path即可(我用的是apache-cxf-2.7.9)
java.lang.NoClassDefFoundError: org/codehaus/stax2/XMLOutputFactory2
解决办法:
原因是少了一个叫stax2-api-3.1.1.jar的jar包,添加该jar包,并加到add to build path即可(我用的是apache-cxf-2.7.9)
注意:要重启服务器端,并且重新生成客户端代码。