使用apach cxf+spring+tomcat搭建提供json格式的对外接口入门Demo

来源:互联网 发布:linux sudo命令 编辑:程序博客网 时间:2024/04/29 19:51

apache cxf是一款可提供webservice服务的轻量级框架。主要格式有xml和json。下面就以apache cxf和spring以及tomcat框架为基础,搭建一个简单的对外提供json格式的接口服务。

下面就开始快乐的学习之旅吧!

由于apache cxf是基于servlet技术的SOA应用框架,所以当然第一件事情就是配置web.xml了。

<web-app>
<display-name>application</display-name>

<!--由于spring也需要进行启动,所以顺带也进行了配置。下面制定了的spring配置文件位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:com/resources/spring-context.xml</param-value>
</context-param>

<!-- 默认的spring配置文件是在WEB-INF下的applicationContext.xml,下面这个是上下文加载器,用于初始化spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!--下面定义了cxfServlet以及加载的顺序-->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<!--定义访问cxf提供的服务时,servlet所做的映射-->
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

上面就把spring容器和cxf框架在servlet容器(此处用tomact)中定义好了。

下面就开始写接口服务了。先上我的项目结构图,如下图所示。


其中接口CxfTestService.java内容如下所示:

//@path指定访问的路径,这个注释是由jsr.jar来提供,下面的@GET注释也是由该jar包来提供,除此之外还提供了@POST(以post进行访问),@QueryParam(用于接口参数声明),@FormParam(用于接口参数声明,如果访问用post方式进行,则若接口方法有参数则可以用该注释申明)等注释。

@Path("/test")
public interface CxfTestService {

@GET
@Path("/init")
public ResultDomain init();
}

上面用注释的方法把接口定义好了,当然也可以选择代码的方式进行声明,本文还是同一采用注释的方式(ps:本人习惯用注释的方式了)。

下面就来看接口实现类CxfTestService.java吧。下面上代码:

public class CxfTestServiceImpl implements CxfTestService{
public ResultDomain init() {
ResultDomain domain = new ResultDomain();
domain.setCode(1);
domain.setResult("成功了");
domain.setResultDesc("操作成功");
return domain;
}
}

大家不要骂我,就是一个用于测试的方法而已,和普通方法完全没区别,但注意了,我们进入这个方法返回ResultDomain去看一下有什么不同吧。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ResultDomain {
public String resultDesc;
public Integer code;
public Object result;

从上面可以看到,该实体类也进行了注释申明。因为cxf使用jaxb进行数据绑定时,要知道对应实体的属性,所以要将类申明为@XmlRootElement。这样jaxb才知道类里面有什么属性。而@XmlAccessorType(XmlAccessType.FIELD)则指定 JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML。

搞定了上面两块东西,下面就剩最后一块内容了,那就是spring容器和cxf的整合。本配置内容放在spring-cxf-out.xml文件中。上配置文件:

<!--下面这块dtd,xsd我就不解释了,就是配置的规范约束-->

<beans xmlns="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/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <!--生成一个cxfTestService实例对象-->
    <bean id="cxfTestService" class="com.cxf.webService.impl.CxfTestServiceImpl" />

    <bean id="securityExceptionMapper" class="com.cxf.webService.impl.CxfTestServiceImpl" />
    

<!--指定返回的json的格式,可以安装字面理解-->

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider">

<!--忽视命名空间-->
<property name="ignoreNamespaces" value="true" />

<!--忽略根节点-->

<property name="dropRootElement" value="true" />

<!--若返回结果是集合,则这个配置为true和false影响到集合内属性的括号问题,若为true,json格式大概是[{}],而反之则是{{}},第一种格式是用gson可以解析的,而第二种是gson无法解析的-->

<property name="dropCollectionWrapperElement" value="true" />

<!--结合的序列化-->
<property name="serializeAsArray" value="true" />
</bean>

<!--用jaxrs来声明服务,ps:spring容器中提供了jaxrs和jaxws来发布cxf服务-->
<jaxrs:server id="cxfServices" address="/">
<jaxrs:serviceBeans>

<!--这里就是将定义好的服务-->
<ref bean="cxfTestService" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider" />
</jaxrs:providers>
</jaxrs:server>
</beans>

好了,到此为止一个简易的对外提供json格式的服务已经搭好了,下面就开启服务进行访问吧!看下图所示,就可已用get方式来访问该接口服务并返回json格式的结果了。


资源下载地址:

http://download.csdn.net/detail/shihai1991/8021127

参考博文:

http://cxf.apache.org/docs/index.html

http://www.ibm.com/developerworks/cn/education/java/j-cxf/


0 0