前面在Axis中介紹過Axis的Handler,這里CXF的Interceptor就和Handler的功能類似。在每個請求響應之前或響應之后,做一些事情。這里的Interceptor就和Filter、Struts的Interceptor很類似,提供它的主要作用就是為了很好的降低代碼的耦合性,提供代碼的內聚性。下面我們就看看CXF的Interceptor是怎么樣工作的。
1、 我們就用上面的HelloWorldService,客戶端的調用代碼重新寫一份,代碼如下:
package
com.hoo.client;
?
import
org.apache.cxf.interceptor.LoggingInInterceptor;
import
org.apache.cxf.interceptor.LoggingOutInterceptor;
import
org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import
org.apache.cxf.phase.Phase;
import
com.hoo.interceptor.MessageInterceptor;
import
com.hoo.service.IHelloWorldService;
?
/**
* <b>function:</b>CXF WebService客戶端調用代碼
* @author hoojo
* @createDate 2011-3-16 上午09:03:49
* @file HelloWorldServiceClient.java
* @package com.hoo.client
* @project CXFWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class ServiceMessageInterceperClient {
public static void main(String[] args) {
//調用WebService
JaxWsProxyFactoryBean factory =
new
JaxWsProxyFactoryBean();
factory.setServiceClass(IHelloWorldService.
class
);
factory.setAddress(
"http://localhost:9000/helloWorld"
);
factory.getInInterceptors().add(
new
LoggingInInterceptor());
factory.getOutInterceptors().add(
new
LoggingOutInterceptor());
IHelloWorldService service = (IHelloWorldService) factory.create();
System.out.println( "[result]" + service.sayHello( "hoojo" ));
}
}
上面的CXF的攔截器是添加在客戶端,同樣在服務器端也是可以添加攔截器Interceptor的。運行后結果如下:
2011-3-18 7:34:00 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 信息: Creating Service {http: //service.hoo.com/}IHelloWorldServiceService from class com.hoo.service.IHelloWorldService 2011-3-18 7:34:00 org.apache.cxf.interceptor.AbstractLoggingInterceptor log 信息: Outbound Message --------------------------- ID: 1 Address: http: //localhost:9000/helloWorld Encoding: UTF-8 Content-Type: text/xml Headers: {SOAPAction=[" "], Accept=[* /*]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHello xmlns:ns1="http://service.hoo.com/"><name>hoojo</name></ns1:sayHello></soap:Body></soap:Envelope> -------------------------------------- 2011-3-18 7:34:01 org.apache.cxf.interceptor.AbstractLoggingInterceptor log 信息: Inbound Message ---------------------------- ID: 1 Response-Code: 200 Encoding: UTF-8 Content-Type: text/xml;charset=UTF-8 Headers: {content-type=[text/xml;charset=UTF-8], Content-Length=[230], Server=[Jetty(7.2.2.v20101205)]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHelloResponse xmlns:ns1="http://service.hoo.com/"><return>hoojo say: Hello World </return></ns1:sayHelloResponse></soap:Body></soap:Envelope> -------------------------------------- [result]hoojo say: Hello World
上面的部分信息是LoggingInterceptor輸出的日志信息,分別在請求和響應的時候輸出日志信息,還有輸出請求的時候參數的信息以及響應的時候返回值的信息。
2、 剛才是客戶端添加Interceptor,現在我們自己編寫一個Interceptor,這個Interceptor需要繼承AbstractPhaseInterceptor,實現handleMessage和一個帶參數的構造函數。然后在服務器端添加這個Interceptor。
Interceptor代碼如下:
package
com.hoo.interceptor;
?
import
org.apache.cxf.interceptor.Fault;
import
org.apache.cxf.message.Message;
import
org.apache.cxf.phase.AbstractPhaseInterceptor;
?
/**
* <b>function:</b> 自定義消息攔截器
* @author hoojo
* @createDate Mar 17, 2011 8:10:49 PM
* @file MessageInterceptor.java
* @package com.hoo.interceptor
* @project CXFWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class MessageInterceptor extends AbstractPhaseInterceptor<Message> {
//至少要一個帶參的構造函數
public
MessageInterceptor(String phase) {
super
(phase);
}
?
public void handleMessage(Message message) throws Fault {
System.out.println(
"############handleMessage##########"
);
System.out.println(message);
if
(message.getDestination() != null) {
System.out.println(message.getId() +
"#"
+ message.getDestination().getMessageObserver());
}
if
(message.getExchange() != null) {
System.out.println(message.getExchange().getInMessage() +
"#"
+ message.getExchange().getInFaultMessage());
System.out.println(message.getExchange().getOutMessage() +
"#"
+ message.getExchange().getOutFaultMessage());
}
}
}
下面看看發布服務和添加自定義攔截器的代碼:
package
com.hoo.service.deploy;
?
import
org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import
org.apache.cxf.phase.Phase;
import
com.hoo.interceptor.MessageInterceptor;
import
com.hoo.service.HelloWorldService;
?
/**
* <b>function:</b>在服務器發布自定義的Interceptor
* @author hoojo
* @createDate 2011-3-18 上午07:38:28
* @file DeployInterceptorService.java
* @package com.hoo.service.deploy
* @project CXFWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class DeployInterceptorService {
?
public static void main(String[] args) throws InterruptedException {
//發布WebService
JaxWsServerFactoryBean factory =
new
JaxWsServerFactoryBean();
//設置Service Class
factory.setServiceClass(HelloWorldService.
class
);
factory.setAddress(
"http://localhost:9000/helloWorld"
);
//設置ServiceBean對象
factory.setServiceBean(
new
HelloWorldService());
//添加請求和響應的攔截器,Phase.RECEIVE只對In有效,Phase.SEND只對Out有效
factory.getInInterceptors().add(
new
MessageInterceptor(Phase.RECEIVE));
factory.getOutInterceptors().add(
new
MessageInterceptor(Phase.SEND));
factory.create();
System.out.println(
"Server start ......"
);
Thread.sleep(1000 * 60);
System.exit(0);
System.out.println(
"Server exit "
);
}
}
值得說的是,以前發布WebService是用Endpoint的push方法。這里用的是JaxWsServerFactoryBean和客戶端調用的代碼JaxWsProxyFactoryBean有點不同。
客戶端調用代碼:
package
com.hoo.client;
?
import
org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import
com.hoo.service.IHelloWorldService;
?
/**
* <b>function:</b>CXF WebService客戶端調用代碼
* @author hoojo
* @createDate 2011-3-16 上午09:03:49
* @file HelloWorldServiceClient.java
* @package com.hoo.client
* @project CXFWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class HelloWorldServiceClient {
public static void main(String[] args) {
//調用WebService
JaxWsProxyFactoryBean factory =
new
JaxWsProxyFactoryBean();
factory.setServiceClass(IHelloWorldService.
class
);
factory.setAddress(
"http://localhost:9000/helloWorld"
);
IHelloWorldService service = (IHelloWorldService) factory.create();
System.out.println( "[result]" + service.sayHello( "hoojo" ));
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
