jaxrscxf的实现与集成.docx
《jaxrscxf的实现与集成.docx》由会员分享,可在线阅读,更多相关《jaxrscxf的实现与集成.docx(6页珍藏版)》请在冰豆网上搜索。
jaxrscxf的实现与集成
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代码<dependency><groupId>javax.ws.rs</groupId><artifactId>javax.ws.rs-api</artifactId><version>2.0-m10</version></dependency>
当然对于之前的版本,基于jsr311。
需要在pom中手动加入:
1.0或1.1版本
Java代码<dependency><groupId>javax.ws.rs</groupId><artifactId>jsr311-api</artifactId><version>1.1.1</version></dependency>
整合
这里主要考虑一下几种整合方式,更多见这里
编程式发布server
在CXF中与JAX-WS一样,提供了JAXRSServerFactoryBean作为工厂服务类来编程式发布资源类
Java代码JAXRSServerFactoryBeansf=newJAXRSServerFactoryBean();//Bindoneormoreresourcessf.setResourceClasses(CustomerService.class,AnotherService.class);//JAX-RS默认是每个请求会实例,这样修改为单例sf.setResourceProvider(CustomerService.class,newSingletonResourceProvider(newCustomerService()));sf.setAddress("http:
//localhost:
9000/");BindingFactoryManagermanager=sf.getBus().getExtension(BindingFactoryManager.class);JAXRSBindingFactoryfactory=newJAXRSBindingFactory();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><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><load-on-startup>5</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
下面介绍两种spring的配置,这也是通用的
jaxrs命名空间
这是一个最简单的配置:
Xml代码<?
xmlversion="1.0"encoding="UTF-8"?
><beansxmlns="http:
//www.springframework.org/schema/beans"xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"xmlns:
jaxrs="http:
//cxf.apache.org/jaxrs"xsi:
schemaLocation="http:
//www.springframework.org/schema/beanshttp:
//www.springframework.org/schema/beans/spring-beans.xsdhttp:
//cxf.apache.org/jaxrshttp:
//cxf.apache.org/schemas/jaxrs.xsd"><importresource="classpath:
META-INF/cxf/cxf.xml"/><importresource="classpath:
META-INF/cxf/cxf-servlet.xml"/><jaxrs:
serverid="customerService"address="/jaxrs"><jaxrs:
serviceBeans><refbean="restPathService1"/></jaxrs:
serviceBeans></jaxrs:
server><beanid="restPathService1"class="org.ws.server.cxf.chap3.cxf.server.CustomerService"/></beans>
当然在jaxrs:
server中可以加入其他节点,具体可参考http:
//cxf.apache.org/schemas/jaxrs.xsd
springbean
也可以使用普通的bean配置,只是需要作为JAXRSServerFactoryBean实例的属性:
Xml代码<?
xmlversion="1.0"encoding="UTF-8"?
><beansxmlns="http:
//www.springframework.org/schema/beans"xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"xsi:
schemaLocation="http:
//www.springframework.org/schema/beanshttp:
//www.springframework.org/schema/beans/spring-beans.xsd"><importresource="classpath:
META-INF/cxf/cxf.xml"/><importresource="classpath:
META-INF/cxf/cxf-servlet.xml"/><beanclass="org.apache.cxf.jaxrs.JAXRSServerFactoryBean"init-method="create"><propertyname="address"value="/jaxrs"/><property:
serviceBeans><refbean="restPathService1"/></property:
serviceBeans></bean><beanid="restPathService2"class="org.ws.server.cxf.chap3.cxf.server.AnotherService"/></beans>
数据绑定(DataBindings)
CXF对JAX-RS的数据绑定与之前的一样,需要选择相应的绑定类型,如需要加入JAXB对XML的处理:
Xml代码<dependency><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})publicUsermeth1(){returnnewUser(1,"robin","123");}
其中User作为返回需要以XML的格式传输,最简单的处理只需要在:
Java代码@XmlRootElement(name="user")publicclassUser{privateIntegerid;privateStringusername;privateStringpassword;
当然更多操作需要了解
再介绍对JSON格式的处理,由于CXF默认支持是依赖Jettison通常我们更喜欢Jackson。
所以,首先需要加入其依赖:
Java代码<dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-jaxrs</artifactId><version>1.9.0</version></dependency>
需要更换默认的JSONproviders为Jackson:
Xml代码<jaxrs:
providers><beanclass="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/></jaxrs:
providers>
或
Xml代码<jaxrs:
providers><beanclass="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/></jaxrs:
providers>
一个完整的例子:
资源类的方法声明:
Java代码@GET@Path("/meth2")@Produces({MediaType.APPLICATION_JSON})publicUsermeth2(){returnnewUser(1,"robin","123");}
spring配