jaxrscxf的实现与集成_第1页
jaxrscxf的实现与集成_第2页
jaxrscxf的实现与集成_第3页
jaxrscxf的实现与集成_第4页
jaxrscxf的实现与集成_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、jaxrscxf 的实现与集成依赖本文基于 cxf2.7.0 ,需要在前面的例子中加入对jaxrs 的依赖:Xml 代码 <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxrs</artifactId><version>2.7.0</version> </dependency>由于2.7.0是采用jax-rs2.0版本,即JSR339,默认会引入:Java 代码<dependenc y& gt

2、;<groupId>javax.ws.rs</groupId><artifactId>javax.ws.rs-api</artifactId><version>2.0-m10</version></dependency>当然对于之前的版本,基于jsr311。需要在pom中手动加入: 1.0 或 1.1 版本Java 代码<dependenc y& gt;<groupId>javax.ws.rs</groupId><artifactId>jsr311-api</ar

3、tifactId><version>1.1.1</version></dependency>这里主要考虑一下几种整合方式,更多见这里编程式发布 server在 CXF 中与 JAX-WS 一样,提供了 JAXRSServerFactoryBean 作为工厂服务类来编程式发布资源类Java 代码 JAXRSServerFactoryBean sf = newJAXRSServerFactoryBean(); /Bind one or more resources sf.setResourceClasses(CustomerService.class, A

4、notherService.class); / JAX-RS 默认是每个请求会实例 , 这样修改为单例 sf.setResourceProvider(CustomerService.class, new SingletonResourceProvider(new CustomerService();sf.setAddress(http:/localhost:9000/);BindingFactoryManager manager = sf.getBus().getExtension(BindingFactoryManager.class); JAXRSBindingFactory factor

5、y = new JAXRSBindingFactory(); factory.setBus(sf.getBus();manager.registerBindingFactory(JAXRSBindingFactory.JAXRS _BINDING_ID, factory); sf.create();spring当然这里说的与 spring 整合少不了与 web 容器的整合, 首先 需要在 web.xml 中添加 CXF 的 servlet 监听请求路径: Xml 代码 <servlet><servlet-name>CXFServlet</servlet-name&

6、gt; <servlet-class>org.apache.cxf.transport.servlet.CXFServle t</servlet-class><load-on-startup>5</load-on-startup></servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>下面介绍

7、两种 spring 的配置,这也是通用的jaxrs 命名空间这是一个最简单的配置:Xml 代码 <?xml version=1.0 encoding=UTF-8?> <beans xmlns=/schema/beans xmlns:xsi=/2001/XMLSchema-instance xmlns:jaxrs=/jaxrs xsi:schemaLocation= /schema/beans

8、 /schema/beans/spring-beans.xs d /jaxrs /schemas/jaxrs.xsd><import resource=classpath:META-INF/cxf/cxf.xml /> <import resource=classpath:META-INF/cxf/cxf-servlet.xml /> <jaxrs:server id=customerService address=/ja

9、xrs><jaxrs:serviceBeans><ref bean=restPathService1/></jaxrs:serviceBeans> </jaxrs:server> <bean id=restPathService1 class=org.ws.server.cxf.chap3.cxf.server.CustomerService/> </beans>当然在 jaxrs:server 中可以加入其他节点,具体可参考 /schemas/jaxrs.xsd spring

10、 bean也可以使用普通的 bean 配置,只是需要作为JAXRSServerFactoryBean 实例的属性:Xml 代码 <?xml version=1.0 encoding=UTF-8?> <beans xmlns=/schema/beans xmlns:xsi=/2001/XMLSchema-instance xsi:schemaLocation= /schema/beans http:/www.springframew

11、/schema/beans/spring-beans.xs d> <import resource=classpath:META-INF/cxf/cxf.xml /><import resource=classpath:META-INF/cxf/cxf-servlet.xml /> <beanclass=org.apache.cxf.jaxrs.JAXRSServerFactoryBean class=org.ws.server.cxf.chap3.cxf.server.AnotherService/> </beans>ini

12、t-method=create> name=address value=/jaxrs/> <property:serviceBeans> bean=restPathService1 /> </property:serviceBeans> <bean id=restPathService2<property<ref</bean>数据绑定 (Data Bindings)CXF 对 JAX-RS 的数据绑定与之前的一样, 需要选择相应的 绑定类型,如需要加入 JAXB 对 XML 的处理:Xml 代码 <dependenc

13、y> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-databinding-jaxb</artifactId> <version>$cxf.version</version> </dependency>这也是 CXF 对 JAX-RS 的默认编码类型,因此我们在采用 XML 作为传输时只需要做简单的处理: 资源类中的一个方法:Java 代码 GET Path(/meth1)Produces( MediaType.APPLICATION_XML )

14、 publicUser meth1() return new User(1, robin,123);其中 User 作为返回需要以 XML 的格式传输,最简单的处 理只需要在:Java 代码 XmlRootElement(name = user) public class User private Integer id;private Stringusername;private String password;当然更多操作需要了解再介绍对 JSON 格式的处理,由于 CXF 默认支持是依赖Jettison通常我们更喜欢Jackson。所以,首先需要加入其依赖:Java 代码<depen

15、denc y& gt;<groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId><version>1.9.0</version></dependency>需要更换默认的 JSON providers 为 Jackson:Xml 代码 <jaxrs:providers><beanclass=org.codehaus.jackson.jaxrs.JacksonJsonProvider/> <

16、;/jaxrs:providers>或Xml 代码 <jaxrs:providers><beanclass=org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider/& gt; </jaxrs:providers>一个完整的例子:资源类的方法声明:publicJava 代码 GET Path(/meth2) Produces( MediaType.APPLICATION_JSON )User meth2() return new User(1, robin,123);spring 配置文件:Xml 代码 <j

17、axrs:server id=customerServiceaddress=/jaxrs><jaxrs:serviceBeans><ref bean=restPathService3/></jaxrs:serviceBeans> <jaxrs:providers> <bean class=org.codehaus.jackson.jaxrs.JacksonJsonProvider/></jaxrs:providers> </jaxrs:server> <beanid=restPathService3

18、 class=org.ws.server.cxf.chap3.cxf.data.RESTDataBindService />更多信息见这里URI 路径选择算法当一个请求 URI 匹配了多个 resource 类,进行下面的算法:1、优先匹配 resource 类 Path 中更多的文字Java 代码 Path(/bar/id) public class Testi Path(/bar/id/baz) public class Test2 Path(/foo) public class Test3 Path(/foo/) public class Test4 对请求URI : /bar/1

19、/baz同时匹配上了 Testi和Test2,但Test2中有9个文字而Testi只有5个,同样对请求/foo/将匹 配 Test42、优先匹配resource类Path中更多组类Java 代码 Path(/bar/id/) public class Test1 Path(/bar/id/id2)public class Test2 对请求URI : /bar/1/2同时匹配Testi和Test2,但Test2中 有 3 个分组将优先匹配3、优先匹配resource类Path中捕获更多的正则组Java 代码 Path(/bar/id:.+/baz/id2)public classTesti P

20、ath(/bar/id/bar/id2)public classTest2 对请求URI : /bar/1/baz/2同时匹配 Testi和Test2,且文字 长度和组都一样,但 Testi 中匹配为 i 而 Test2 匹配中 0在多个 resource 方法中选择 根据上面的规则,我们已经选择了 resource 类。接下来对类 中方法的选择也遵循这个原则,其中只有一点额外需要注 意:如果同时包含 sub-resource 优先选择非 sub-resourceJava 代码 Path(/rest) public class Testipublic class Path(/bar) GET

21、public Order getOrder() .Path(/bar) public OrdergetOrderFromSubresource() .Order Path(/) GET public OrdergetOrder() return this; 对请求 URI: /rest/bar 将匹配方法 getOrder() 因为另外一个是sub-resource方法与 MediaType 的选择 考虑这样的情况如果方法都匹配,但是 MediaType 不一样:Java 代码 Path(/rest) public class TestiPath(/bar)POSTConsumes(appli

22、cation/json)Produces(application/json)public OrderaddOrderJSON(OrderDetails details) . Path(/bar)POSTConsumes(application/xml)Produces(application/xml)public OrdergetOrderXML(OrderDetails details) .对请求 URI: /rest/bar 以上两个都匹配,当然如果请求的Content-Type 和 Accept 都有设置相应的类型, 那么就好判断, 如 application/json 指向 addOr

23、derJSON, 如果是 application/xml 则指向方法 getOrderXML 当然,如果客户端并没明显指定而 是直接在浏览器请求, 可能会选择的是 getOrderXML 因为默 认的可能是:Xml 代码 Content-Type: text/html Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8当然其实可以更好的方式处理这种情况:Java 代码 Path(/) public class TestiPath(/bar) POSTConsumes(application/json,

24、application/xml) Produces(application/json, application/xml) public Order addOrder(OrderDetails details) .自定义 URI 选择算法CXF 2.2.5 以后提供了自定义的 URI 选择器,需要实现 ResourceComparator 接口Java 代码 public class QueryResourcelnfoComperator extends OperationResourceInfoComparator implements ResourceComparator publicQue

25、ryResourcelnfoComperator() super(null,null);Overridepublic intcompare(ClassResourceInfo cri1, ClassResourceInfo cri2,Message message) return 0; Overridepublic int compare(OperationResourceInfooper1, OperationResourceInfo oper2, Message message)int cxfResult = pare(oper1,oper2);if (cxfResult != 0)ret

26、urn cxfResult;/OperationResourceInfo 获取resource 方法请求路径相关信息int op1Counter= getMatchingRate(oper1, message);intop2Counter = getMatchingRate(oper2, message);/通过两两比较权重选择具体的方法returnop1Counter = op2Counter ? 0 : op1Counter < op2Counter ?1 : -1; protected intgetMatchingRate(OperationResourceInfo operati

27、on, Messagemessage) List<Parameter> params =operation.getParameters(); if (params = null |params.size() =0) return 0;Set<String> qParams = getParams(String) message.get(Message.QUERY_STRING); / 匹配更多的参数获得更多的权限int rate = 0;for (Parameter p : params) switch (p.getType() case QUERY:if (qPara

28、ms.contains(p.getName()rate += 2;else if(p.getDefaultValue() = null)rate -= 1;break;default:break;returnrate; /* param query URLQuery Example: key=value&key2=value2*return A Set of all keys, contained within query.*/protected Set<String> getParams(String query) Set<String> params = n

29、ew HashSet<String>();if (query = null |query.length() = 0)return params;MultivaluedMap<String, String> allQueries = JAXRSUtils.getStructuredParams(query, &, false, false); return allQueries.keySet(); 注册相应的服务:Xml 代码 <jaxrs:server id=customerService address=/jaxrs> <jaxrs:serviceBeans> <ref bean=restPathService6/> </jaxrs:serviceBeans><jaxrs:resourceComparator> <beanclass=org.ws.server.cxf.chap3.cxf.uri.QueryResourceInfoComp erator/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论