WebService-CXF發佈javaSE項目


1、記得調整你的jdk版本爲jdk1.6.0_24.

2、將所有cxfjar包拷貝到項目中來。添加到classpth中。

3、在開發之前可以先閱讀CXF_HOME\lib\WATCH_JARS文件,分析jar文件之間的依賴關係。鑑於簡單開發,所以直接都拷貝過來。

    (在我的項目當中已經去除了一些jar文件。)



CXF發佈服務的類:

用兩個不同的類發佈應用:
ServerFactoryBean   -- FacotryBean
JaxWsServerFactoryBean(建議使用此類)

服務與客戶端類調用原則:



使用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客戶端調用

l此調用過程與ClientProxyFactoryBean的要求一樣,也必須要擁有一個接口。
l此時,仍然可以使用wsimport生成接口,在其他項目的調用。


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生成客戶代碼:

在cxf中,也提供了一個用於生成客戶端調用代碼的工具。它的功能就如同wsimport一樣。
先讓我們瞭解一下cxf的wsdl2java工具,可以生成一堆客戶端調用的代碼。
此工具位於cxf_home/bin目錄下。參數與wsimport有所不同。
它包含以下參數:
d參數,指定代碼生成的目錄。
p參數,指定生成的新的包結構。
需要說明的是,由於wsdl2java是根據jdk1.7生成的本地代碼,所以,需要對生成的代碼做一點點修改。
在命令行執行:

  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、必須已經使用wsimportwsdl2java生成了客戶端代碼。

以下是源代碼:

/**

 * 使用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...");
	}
}




總結:

l如何通過ant發佈第一個cxf應用。
l手工建立一個java項目發佈cxfws.
lJava項目和js訪問webService
l加入消息攔截器
l將服務端改爲SOAP1.2實現  
@WebService
@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
/**
 * 通過@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)轉換爲實現SOAP1.2
 */
public interface IHelloService {

	public String sayHello(String name);
}

lSOAP1.11.2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章