CXFgh1Word文档下载推荐.docx
《CXFgh1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《CXFgh1Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
对于那些需要重用IT遗留系统的用户来说,ApacheCXF可扩展的插拔式架构允许定制开发并混合使用任何类型的通信协议及通信消息格式。
支持多种容器部署。
基于ApacheCXF的web服务可以单独运行,也可部署在多种容器里,包括轻量级容器如Tomcat及Spring,JEE容器如Geronimo,JBOSS,WebLogic等。
同时,ApacheCXFweb服务还可以服务引擎方式部署于JBI容器如ServiceMix或OpenESB。
SCA容器如ApacheTuscany的支持也在计划之中。
多种传输方式、Bindings、DataBindings和Format
Bindings:
SOAP、REST/HTTP;
DataBndings:
目前支持JAXB2.0、Aegis两种,默认是JAXB2.0。
XMLBeans、Castor和JiBX数据绑定方式将在CXF2.1版本中得到支持;
格式(Format):
XML、JSON;
传输方式:
HTTP、Servlet、JMS和Jabber;
可扩展的API允许为CXF增加其它的Bindings,以能够支持其它的消息格式,比如:
CSV和固定记录长度。
灵活部署
轻量级容器:
可在Tomcat或基于Spring的容器中部署Services;
集成JBI:
可以在如ServiceMix,OpenESBorPetals等等的JBI容器中将它部署为一个服务引擎;
集成SCA:
可以部署在如Tuscany之类的SCA容器中;
集成J2EE:
可以在J2EE应用服务器中部署Services,比如:
Geronimo、JOnAS、JBoss、WebSphereApplicationServer和WebLogicApplicationServer,以及Jetty和Tomcat;
独立的Java客户端/服务器。
支持多种编程语言
全面支持JAX-WS2.0客户端/服务器编程模型;
支持JAX-WS2.0synchronous、asynchronous和one-wayAPI'
s;
支持JAX-WS2.0DynamicInvocationInterface(DII)API;
支持wrappedandnon-wrapped风格;
支持XMLmessagingAPI;
支持JavaScript和ECMAScript4XML(E4X),客户端与服务端均支持;
通过Yoko支持CORBA;
通过Tuscany支持SCA;
通过ServiceMix支持JBI;
代码生成
JavatoWSDL;
WSDLtoJava;
XSDtoWSDL;
WSDLtoXML;
WSDLtoSOAP;
WSDLtoService;
CXF框架支撑环境
CXF框架是一种基于Servlet技术的SOA应用开发框架,要正常运行基于CXF应用框架开发的企业应用,除了CXF框架本身之外,还需要JDK和Servlet容器的支持。
2)基础架构
CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成:
(1).Bus
它是CXF架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于Spring的ApplicationContext。
这些共享资源包括WSDL管理器、绑定工厂等。
通过对Bus进行扩展,可以方便地容纳自己的资源,或替换现有的资源。
默认Bus实现是基于Spring的,通过依赖注入,将运行时组件串起来。
Bus的创建由BusFactory负责,默认是SpringBusFactory,对应于默认Bus实现。
在构造过程中,SpringBusFactory会搜索META-INF/cxf(就包含在CXF的Jar中)下的所有Bean配置文件,根据它们构建一个ApplicationContext。
开发者也可提供自己的配置文件来定制Bus。
2.消息传递和拦截器(Interceptor)
CXF建立于一个通用的消息层之上,主要由消息、拦截器和拦截器链(InterceptorChain)组成。
CXF是以消息处理为中心的,熟悉JSP/Servlet的开发者可以将拦截器视为CXF架构中的“Filter”,拦截器链也与“FilterChain”类似。
通过拦截器,开发者可以方便地在消息传递、处理的整个过程中对CXF进行扩展。
拦截器的方法主要有两个:
handleMessage和handleFault,分别对应消息处理和错误处理。
每个方法把消息对象类型作为一个参数。
handleFault方法实现处理错误环境。
拦截器通常以链的方式处理,链上的每个拦截器在消息序列里执行一些处理,这个链向前移。
当一个错误条件出现时,handleFault方法在每个拦截器上调用,并且这个链没有展开或者向后退。
拦截器经常成组形成状态。
拦截器提供了公共的函数能组成一个状态,每个状态执行特定的消息处理。
每个状态于是加入拦截器。
这个链可以创建成inboundandoutbound消息。
一个典型的WEB服务端点有三个拦截器链
•Inboundmessageschain
•Outboundmessageschain
•Errormessageschain
拦截器里还有内置的拦截器,如日志,安全等,开发者也可选择创建自定义拦截器。
3.前端(FrontEnd)
它为CXF提供了创建服务的编程模型,当前主要的前端就是JAX-WS。
4.服务模型
CXF中的服务通过服务模型来表示。
它主要有两部分:
ServiceInfo和服务本身。
ServiceInfo作用类似WSDL,包含接口信息、绑定、端点(EndPoint)等信息;
服务则包含了ServiceInfo、数据绑定、拦截器和服务属性等信息。
可使用Java类和WSDL来创建服务。
一般是由前端负责服务的创建,它通过ServiceFactory来完成。
5.绑定(Binding)
绑定提供了在传输之上映射具体格式和协议的方法,主要的两个类是Binding和BindingFactory。
BindingFactory负责创建Binding。
6.传输(Transport)
为了向绑定和前端屏蔽传输细节,CXF提供了自己的传输抽象。
其中主要有两个对象:
Conduit和Destination。
前者是消息发送的基础,后者则对应消息接收。
开发者还可以给Conduit和Destination注册MessageObserver,以便在消息发送和接收时获得通知。
AddingexceptionhandlingtoRESTfulservice
Let'
stakeascenariowhereaclientsendsarequesttodeleteorupdateacategory,andthecategorydoesnotexist,soyourimplementationneedstoreturnthecorrecterrormessagebacktotheclient.
Todealwithexceptions,JAX-RSprovidestheWebApplicationException,whichextendstheJavaRuntimeExceptionclass.TheWebApplicationExceptioncantakeanHTTPstatuscodeorjavax.ws.rs.core.Responseobjectaspartoftheconstructor.TheResponseobjectcanbeusedtosettheentityinformationprovidingauserreadableerrormessagealongwiththeHTTPstatuscode.
Typically,exceptionhandlingforRESTfulservicewouldfallintooneofthefollowingcategories:
•TheimplementationclasscanthrowanuncheckedWebApplicationExceptionwiththerequiredHTTPErrorcode.TheHTTPspecificationdefineswhichHTTPresponsecodeshouldbeusedforunsuccessfulrequests,whichcanbeinterpretedbyclientsinastandardway.Forexample,Statuscode4xxdefinesclienterror,suchasBadrequest,and5xxdefinestheserverrequestwhereserverfailedtofulfillavalidrequest.
•Theimplementationclasscancreateajavax.ws.rs.core.ResponseobjectandsendacustomerrormessagetotheclientorsendtherequiredHTTPstatuscodeintheresponse.
•Theimplementationclasscanthrowacheckedexception,andyoucanwireanExceptionResolverimplementationtoconverttheapplicationexceptiontotheResponseobject.TheExceptionResolverinterfaceprovidesacontractforaproviderthatmapsJavaexceptiontoaResponse.Forinstance,ifyouarefetchinginformationfromthedatabase,andarecorddoesnotexist,andyourapplicationthrowsaRecordNotFoundexception,thenyoucanmapthisexceptiontoaResponseobjectusingyourExceptionResolverimplementation.TheResponseobjectcanbepopulatedwithacustomerrormessageandsentbacktotheclient,asmentionedinthesecondapproach.
WewillnowmodifytheCategoryServiceclasstoaddtheexceptionhandlingcapability.Weusethefirstandsecondapproachforexceptionhandlingtounderstandtheseconceptsindetail.ThefollowingistherevisedCategoryServiceclass,wehaveonlyshownthecodesnippetswhichhavechanged.
packagedemo.restful;
//JAX-RSImports…
/*
*CategoryServiceclass-Add/Removescategoryforbooks
*/
@Path("
/categoryservice"
)
@Produces("
application/xml"
publicclassCategoryService{
@GET
/category/{id}"
)
publicCategorygetCategory(@PathParam("
id"
)Stringid){
System.out.println("
getCategorycalledwithcategoryid:
"
+id);
Categorycat=(Category)getCategoryDAO().getCategory(id);
if(cat==null){
ResponseBuilderbuilder=Response.status(Status.BAD_REQUEST);
builder.type("
);
builder.entity("
<
error>
CategoryNotFound<
/error>
"
thrownewWebApplicationException(builder.build());
}else{
returncat;
}
@POST
/category"
@Consumes("
publicResponseaddCategory(Categorycategory){
addCategorycalled"
Categorycat=(Category)getCategoryDAO().getCategory(
category.getCategoryId());
if(cat!
=null){
returnResponse.status(Status.BAD_REQUEST).build();
getCategoryDAO().addCategory(category);
returnResponse.ok(category).build();
@DELETE
publicResponsedeleteCategory(@PathParam("
deleteCategorywithcategoryid:
getCategoryDAO().deleteCategory(id);
returnResponse.ok().build();
@PUT
publicResponseupdateCategory(Categorycategory){
updateCategorywithcategoryid:
+category.getCategoryId());
getCategoryDAO().updateCategory(category);
/category/book"
publicResponseaddBooks(Categorycategory){
addBookswithcategoryid:
returnResponse.status(Status.NOT_FOUND).build();
getCategoryDAO().addBook(category);
/category/{id}/books"
publicResponsegetBooks(@PathParam("
getBookscalledwithcategoryid:
cat.setBooks(getCategoryDAO().getBooks(id));
returnResponse.ok(cat).build();
}
ThecodehighlightedintheabovecodelistingisthemodificationthatwehavemadetoaddexceptionhandlingtotheCategoryServiceimplementation.ThegetCategorymethodusesthefirstapproach,wherewehaveusedajavax.ws.rs.core.Response.ResponseBuildertocreateaResponseobject,settheentityerrormessageasxml<
andHTTPStatuscodeasBAD_REQUEST.WethenbuildtheresponseandthrowaWebApplicationExceptionbacktotheclient,asshowninabovecodelisting.TheCXFframeworkwouldconverttheWebApplicationExceptionintorequiredHTTPformatandsendtheresponsebacktotheclient.WewilllookatHTTPresponsecontentindetailinthenextchapterwherewewilllookatvarioustestscenariosforCategoryServiceimplementation.
Forthe