1、記得調整你的jdk版本爲jdk1.6.0_24.
2、將所有cxf的jar包拷貝到項目中來。添加到classpth中。
3、在開發之前可以先閱讀CXF_HOME\lib\WATCH_JARS文件,分析jar文件之間的依賴關係。鑑於簡單開發,所以直接都拷貝過來。
(在我的項目當中已經去除了一些jar文件。)
CXF發佈服務的類:
服務與客戶端類調用原則:
使用ServerFactoryBean發佈服務:
@WebService
/**
* 通過@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)轉換爲實現SOAP1.2
*/
public interface IHelloService {
public String sayHello(String name);
}
public class HelloServiceImpl implements IHelloService {
public String sayHello(String name) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sayHello()... name:" + name);
return sdf.format(new Date()) + " hello " + name;
}
}
/**
*
* 使用JaxWsServerFactoryBean發佈CXF的Web服務
* 必須加入WebService註解,如果不加,雖然不報錯,但是所有的方法都暴露不出來
*/
public class Server {
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
bean.setAddress("http://127.0.0.1:7788/hello");
//提供服務的類的類型或接口類型
bean.setServiceClass(IHelloService.class);
bean.setServiceBean(new HelloServiceImpl());
//加入請求的消息攔截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//加入請求的消息攔截器
bean.getOutInterceptors().add(new LoggingOutInterceptor());
bean.create();
System.out.println("Hello Service ready...");
}
}
使用ClientProxyFactoryBean客戶端調用:
public class Client {
public static void main(String[] args) {
ClientProxyFactoryBean bean = //創建客戶端類
new ClientProxyFactoryBean();
//設置訪問地址
bean.setAddress("http://localhost:9999/one");
//設置服務接口,直接使用本項目中的接口
bean.setServiceClass(CxfOne.class);
//通過create方法返回接口實例
CxfOne s = (CxfOne) bean.create();
String str = s.sayHi();//調用
System.err.println(str);
}
}
使用JaxWsServerFactoryBean發佈服務: (建議使用此類)
使用CXF的類發佈一個服務:
/**
* 使用JaxWsServerFactoryBean發佈CXF的Web服務
* 必須加入WebService註解,如果不加,雖然不報錯,但是所有的方法都<b>暴露不出來<b>
*/
@WebService
public class HiService {
public String sayHi(String name){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sayHi()... name:" + name);
return sdf.format(new Date()) + " hi " + name;
}
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
//服務的地址
bean.setAddress("http://127.0.0.1:6789/hi");
//提供服務的類的類型
bean.setServiceClass(HiService.class);
//提供服務的實例
bean.setServiceBean(new HiService());
//發佈服務 publish()...
bean.create();
System.out.println("server ready...");
}
}
使用JaxWsProxyFactoryBean客戶端調用
public class A {
public static void main(String[] args) {
//Cxf2Server t =
//new Cxf2ServerService().getCxf2ServerPort();
//String s = t.sayHello();
//System.err.println(s);
JaxWsProxyFactoryBean bean =
new JaxWsProxyFactoryBean();
bean.setAddress("http://localhost:9999/two");
//此外註冊的必須是一個接口,否則將拋出異常信息
bean.setServiceClass(Cxf2Server.class);
Cxf2Server s = (Cxf2Server) bean.create();
System.err.println(s.sayHello());
}
}
wsdl2java生成客戶代碼:
wsdl2java –d .http://127.0.0.1:6666/helloworld?wsdl
1、注意:由於使用的是apache-cxf-2.4.0版本,它是支持jdk1.7的。所以,對於生成的Service要進行稍微的修改。
在jdk1.6中的javax.xml.ws.Service的構造方法接收二個參數爲:(Stringurl,QNameqname);
在jdk1.7中的javax.xml.ws.Service的構造方法中接收三個參數爲:(Stringurl,QNameqname,features);
2、將生成的代碼,拷貝到項目目錄,然後使用以前相同方法調用。
注意:如果你對@WebMethod設置了header=true參數,將會在調用時多傳遞一個參數。它參數可以直接傳null值。
對於這種情況,可以將header=true修改成header=false然後再重要獲取客戶端源代碼。
3、大家可能發現了,使用cxf生成的客戶端代碼與wsimport差不多,甚至是一樣,那爲什麼還要使用cxf呢?
它較好的發佈方式、較容易的與其他服務器集成、及與Spring的完美結合都不得不讓我們使用cxf。
調用端代碼:
1、必須已經使用wsimport或wsdl2java生成了客戶端代碼。
以下是源代碼:
/**
* 使用java6來調用cxf生成的客戶端類的服務
* 不管是用wsimport還是用wsdl2java生成的類基本上是完全一樣的
*/
public class App {
public static void main(String[] args) {
IHelloServiceService hss = new IHelloServiceService();
IHelloService hs = hss.getIHelloServicePort();
String ret = hs.sayHello("aa");
System.out.println(ret);
}
}
給服務添加消息攔截器:-這個非常有用:
public class Server {
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
bean.setAddress("http://127.0.0.1:7788/hello");
//提供服務的類的類型或接口類型
bean.setServiceClass(IHelloService.class);
bean.setServiceBean(new HelloServiceImpl());
//加入請求的消息攔截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//加入請求的消息攔截器
bean.getOutInterceptors().add(new LoggingOutInterceptor());
bean.create();
System.out.println("Hello Service ready...");
}
}
總結:
@WebService
@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
/**
* 通過@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)轉換爲實現SOAP1.2
*/
public interface IHelloService {
public String sayHello(String name);
}