GVKun编程网logo

基于SSM+CXF构建的RESTFul webservice(基于ssm架构的项目源码)

12

这篇文章主要围绕基于SSM+CXF构建的RESTFulwebservice和基于ssm架构的项目源码展开,旨在为您提供一份详细的参考资料。我们将全面介绍基于SSM+CXF构建的RESTFulwebse

这篇文章主要围绕基于SSM+CXF构建的RESTFul webservice基于ssm架构的项目源码展开,旨在为您提供一份详细的参考资料。我们将全面介绍基于SSM+CXF构建的RESTFul webservice的优缺点,解答基于ssm架构的项目源码的相关问题,同时也会为您带来Apache CXF 和 Spring 开发RESTful Web Service 2、Apache CXF实战之四 构建RESTful Web Service、cxf RESTful Web services 没有WADL、CXF RESTFUL WebService 针对ajax 跨域问题的实用方法。

本文目录一览:

基于SSM+CXF构建的RESTFul webservice(基于ssm架构的项目源码)

基于SSM+CXF构建的RESTFul webservice(基于ssm架构的项目源码)

开发环境:maven3.3.3、apache-tomcat-6.0.44、jdk1.6.0_13

开发技术:spring3.2.8、cxf2.7.12、mybatis3.2.8、druid1.0.11


项目截图:




项目源码:

一、配置文件

1、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.neusoft.icelake</groupId>
	<artifactId>restservice</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>restservice</name>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.6</java.version>
		<spring.version>3.2.8.RELEASE</spring.version>
		<servlet-api.version>2.5</servlet-api.version>
		<slf4j.version>1.7.5</slf4j.version>
		<cxf.version>2.7.12</cxf.version>
		<jackson.version>2.1.4</jackson.version>
		
		<mybatis.version>3.2.8</mybatis.version>
		<mybatisspring.version>1.2.2</mybatisspring.version>
		<druid.version>1.0.11</druid.version>
	</properties>

	<dependencies>
		<!-- spring begin -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc-portlet</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- spring end -->

		<!-- @Inject begin -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
		<!-- @Inject end -->

		<!-- servlet begin -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet-api.version}</version>
		</dependency>
		<!-- servlet end -->

		<!-- cxf begin -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxrs</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-rs-extension-providers</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jettison</groupId>
			<artifactId>jettison</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>javax.ws.rs</groupId>
			<artifactId>jsr311-api</artifactId>
			<version>1.1.1</version>
		</dependency>
		<!-- cxf end -->

		<!-- JSON begin -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.module</groupId>
			<artifactId>jackson-module-jaxb-annotations</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.jaxrs</groupId>
			<artifactId>jackson-jaxrs-json-provider</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.0</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-core-asl</artifactId>
			<version>1.9.0</version>
		</dependency>
		<!-- JSON end -->

		<!-- MyBatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${mybatisspring.version}</version>
		</dependency>
		<!-- AOP begin -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.7.4</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.7.4</version>
		</dependency>
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib</artifactId>
			<version>3.1</version>
		</dependency>
		<!-- AOP end -->		
		<!-- jdbc driver -->
		<dependency>
			<groupId>localrep.sybase</groupId>
			<artifactId>jconn</artifactId>
			<version>2.0</version>
		</dependency>
		<!-- connection pool -->
		<dependency>
		     <groupId>com.alibaba</groupId>
		     <artifactId>druid</artifactId>
		     <version>${druid.version}</version>
		</dependency>	
	</dependencies>

	<build>
		<plugins>
			<!-- compiler插件,设定JDK版本 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.0</version>
				<configuration>
					<source>${java-version}</source>
					<target>${java-version}</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	
	<!-- PROGRAMER INFO -->
	<organization>
		<name>Neusoft</name>
		<url>http://www.neusoft.com</url>
	</organization>	
</project>

2、spring配置文件applicationContext-server.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	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.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

	<context:component-scan base-package="com.neusoft.icelake" />

	<import resource="classpath*:meta-inf/cxf/cxf.xml" />
	<import resource="classpath*:meta-inf/cxf/cxf-extension-soap.xml" />
	<import resource="classpath*:meta-inf/cxf/cxf-servlet.xml" />

	<jaxrs:server id="restServiceContainer" address="/rest">
		<jaxrs:providers>
			<ref bean="jacksonProvider" />
		</jaxrs:providers>
		<jaxrs:extensionMappings>
			<entry key="json" value="application/json" />
			<entry key="xml" value="application/xml" />
		</jaxrs:extensionMappings>

		<jaxrs:serviceBeans>
			<ref bean="wholeQuantityService" />
		</jaxrs:serviceBeans>

		<jaxrs:inInterceptors>
			<bean></bean>
		</jaxrs:inInterceptors>
		<jaxrs:outInterceptors>
			<bean></bean>
		</jaxrs:outInterceptors>
	</jaxrs:server>

	<bean id="jacksonObjectMapper"https://www.jb51.cc/tag/factorybean/" target="_blank">factorybean"></bean>
	<bean id="jacksonProvider">
		<property name="mapper" ref="jacksonObjectMapper" />
	</bean>

</beans>

3、spring配置文件applicationContext-mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd	
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	
	<context:property-placeholder ignore-unresolvable="true" location="classpath:config.properties" />

	<bean name="dataSource"init-method="init" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="initialSize" value="0" />		
		<property name="maxActive" value="20" />	
		<property name="minIdle" value="0" />		
		<property name="maxWait" value="60000" />
		<property name="validationQuery" value="${jdbc.testsql}" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="testWhileIdle" value="true" />
		<property name="timeBetweenevictionRunsMillis" value="60000" />
		<property name="minevictableIdleTimeMillis" value="25200000" />
		<property name="removeAbandoned" value="true" />
		<property name="removeAbandonedTimeout" value="1800" />
		<property name="logAbandoned" value="true" />
		<property name="filters" value="mergeStat" />
	</bean>

	<bean id="sqlSessionFactory"https://www.jb51.cc/tag/sql/" target="_blank">sqlSessionfactorybean">
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations" value="classpath:com/neusoft/icelake/mappers/**/*.xml" />
	</bean>
	<beanhttps://www.jb51.cc/tag/fig/" target="_blank">figurer">
		<property name="basePackage" value="com.neusoft.icelake" />
		<property name="sqlSessionfactorybeanName" value="sqlSessionFactory" />
	</bean>

	<bean id="transactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="required" />
			<tx:method name="append*" propagation="required" />
			<tx:method name="insert*" propagation="required" />
			<tx:method name="save*" propagation="required" />
			<tx:method name="update*" propagation="required" />
			<tx:method name="modify*" propagation="required" />
			<tx:method name="edit*" propagation="required" />
			<tx:method name="delete*" propagation="required" />
			<tx:method name="remove*" propagation="required" />
			<tx:method name="repair" propagation="required" />
			<tx:method name="delAndRepair" propagation="required" />

			<tx:method name="get*" propagation="SUPPORTS" />
			<tx:method name="find*" propagation="SUPPORTS" />
			<tx:method name="load*" propagation="SUPPORTS" />
			<tx:method name="search*" propagation="SUPPORTS" />
			<tx:method name="datagrid*" propagation="SUPPORTS" />

			<tx:method name="*" propagation="SUPPORTS" />
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut id="transactionpointcut" expression="execution(* com.neusoft.icelake..*impl.*(..))" />
		<aop:advisor pointcut-ref="transactionpointcut" advice-ref="transactionAdvice" />
	</aop:config>

</beans>

4、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>restservice</display-name>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:/spring-context*.xml</param-value>
	</context-param>
	<listener>
		<description>spring listener</description>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<servlet>
		<servlet-name>CXFServlet</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>DruidStatView</servlet-name>
		<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DruidStatView</servlet-name>
		<url-pattern>/druid/*</url-pattern>
	</servlet-mapping>

	<filter>
		<filter-name>DruidWebStatFilter</filter-name>
		<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
		<init-param>
			<param-name>exclusions</param-name>
			<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>DruidWebStatFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

二、Java代码


1、entity类(Org.java、Orgs.java)

package com.neusoft.icelake.modules.standard.entity;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "SapOrg")
public class Org implements Serializable {

    private static final long serialVersionUID = 7446548875479453298L;

    private String parent_id;

    private String parent_desc;

    private String child_id;

    private String child_desc;

    private String child_short;

    private String org_sort;

    public String getParent_id() {
        return parent_id;
    }

    public void setParent_id(String parent_id) {
        this.parent_id = parent_id;
    }

    public String getParent_desc() {
        return parent_desc;
    }

    public void setParent_desc(String parent_desc) {
        this.parent_desc = parent_desc;
    }

    public String getChild_id() {
        return child_id;
    }

    public void setChild_id(String child_id) {
        this.child_id = child_id;
    }

    public String getChild_desc() {
        return child_desc;
    }

    public void setChild_desc(String child_desc) {
        this.child_desc = child_desc;
    }

    public String getChild_short() {
        return child_short;
    }

    public void setChild_short(String child_short) {
        this.child_short = child_short;
    }

    public String getorg_sort() {
        return org_sort;
    }

    public void setorg_sort(String org_sort) {
        this.org_sort = org_sort;
    }

    @Override
    public String toString() {
        return "Org [parent_id=" + parent_id + ",parent_desc=" + parent_desc + ",child_id=" + child_id
                + ",child_desc=" + child_desc + ",child_short=" + child_short + ",org_sort=" + org_sort
                + "]";
    }
}

package com.neusoft.icelake.modules.standard.entity;

import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "SapOrgs")
public class Orgs {
    private List<Org> list;

    private Org[] array;

    private Map<String,Org> map;

    public List<Org> getList() {
        return list;
    }

    public void setList(List<Org> list) {
        this.list = list;
    }

    public Org[] getArray() {
        return array;
    }

    public void setArray(Org[] array) {
        this.array = array;
    }

    public Map<String,Org> getMap() {
        return map;
    }

    public void setMap(Map<String,Org> map) {
        this.map = map;
    }
}

2、Mybatis mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.neusoft.icelake.modules.standard.dao.IWholeQuantityDao">
	<resultMap id="EmpResultMap"
		type="com.neusoft.icelake.modules.standard.entity.Emp">
		<id column="accno" property="accno" jdbcType="VARCHAR" />
		<result column="truename" property="truename" jdbcType="VARCHAR" />
		<result column="gender" property="gender" jdbcType="VARCHAR" />
		<result column="office_mail" property="office_mail" jdbcType="VARCHAR" />
		<result column="title" property="title" jdbcType="VARCHAR" />
		<result column="dp_id" property="dp_id" jdbcType="VARCHAR" />
		<result column="person_sort" property="person_sort" jdbcType="VARCHAR" />
		<result column="del_tag" property="del_tag" jdbcType="VARCHAR" />
	</resultMap>
	<resultMap id="OrgResultMap"
		type="com.neusoft.icelake.modules.standard.entity.Org">
		<id column="child_id" property="child_id" jdbcType="VARCHAR" />
		<result column="child_desc" property="child_desc" jdbcType="VARCHAR" />
		<result column="child_short" property="child_short" jdbcType="VARCHAR" />
		<result column="parent_id" property="parent_id" jdbcType="VARCHAR" />
		<result column="parent_desc" property="parent_desc" jdbcType="VARCHAR" />
		<result column="org_sort" property="org_sort" jdbcType="VARCHAR" />
	</resultMap>
	<sql id="Emp_Column_List">
		accno,truename,gender,office_mail,title,dp_id,person_sort,del_tag
	</sql>
	<sql id="Org_Column_List">
		parent_id,parent_desc,child_id,child_desc,child_short,org_sort
	</sql>
	<select id="getEmpAll" resultMap="EmpResultMap">
		select
		<include refid="Emp_Column_List" />
		from v_person
	</select>
	<select id="getorgall" resultMap="OrgResultMap">
		select
		<include refid="Org_Column_List" />
		from v_sap_org_node
	</select>
</mapper>

3、接口的服务类

package com.neusoft.icelake.modules.standard.service;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.neusoft.icelake.modules.standard.entity.Emps;
import com.neusoft.icelake.modules.standard.entity.Orgs;

@Path("/wq")
public interface IWholeQuantityService {

    @GET
    @Path("/orglist")
    @Produces({ MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML })
    public Orgs getorgList();

    @GET
    @Path("/emplist")
    @Produces({ MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML })
    public Emps getEmpList();
}

4、接口的实现类

package com.neusoft.icelake.modules.standard.service.impl;

import java.util.List;

import javax.inject.Named;

import org.springframework.beans.factory.annotation.Autowired;

import com.neusoft.icelake.modules.standard.dao.IWholeQuantityDao;
import com.neusoft.icelake.modules.standard.entity.Emp;
import com.neusoft.icelake.modules.standard.entity.Emps;
import com.neusoft.icelake.modules.standard.entity.Org;
import com.neusoft.icelake.modules.standard.entity.Orgs;
import com.neusoft.icelake.modules.standard.service.IWholeQuantityService;

@Named("wholeQuantityService")
public class WholeQuantityServiceImpl implements IWholeQuantityService {
    private IWholeQuantityDao wholeQuantityDao;

    public IWholeQuantityDao getWholeQuantityDao() {
        return wholeQuantityDao;
    }

    @Autowired
    public void setWholeQuantityDao(IWholeQuantityDao wholeQuantityDao) {
        this.wholeQuantityDao = wholeQuantityDao;
    }

    @Override
    public Orgs getorgList() {
        Orgs orgs = new Orgs();
        List<Org> orglist = wholeQuantityDao.getorgall();
        orgs.setList(orglist);
        return orgs;
    }

    @Override
    public Emps getEmpList() {
        Emps emps = new Emps();
        List<Emp> emplist = wholeQuantityDao.getEmpAll();
        emps.setList(emplist);
        return emps;
    }
}


运行项目:

打开浏览器,在地址栏输入:http://localhost:8080/restservice/rest?_wadl

可以看到我们发布的webservice的接口描述文件(wadl描述):


访问http://localhost:8080/restservice/rest/wq/orglist?_type=json,返回Json结果,

或者http://localhost:8080/restservice/rest/wq/orglist?_type=xml,返回XML


源码下载:http://download.csdn.net/detail/iamlake/9498889

Apache CXF 和 Spring 开发RESTful Web Service 2

Apache CXF 和 Spring 开发RESTful Web Service 2

###开发环境 Maven Eclipse Tomcat

###快速构建 archetype太少?关于如何添加本地archetype catalog:

下载文件 http://repo1.maven.org/maven2/archetype-catalog.xml 设置Eclipse 首选项 Maven Archetype ,将archetype-catalog.xml 添加为Local catalog.

使用Archetype 创建Maven项目,坐标:

org.apache.cxf.archetype

cxf-jaxrs-service 3.1.4

注释掉pom.xml文件中的插件配置,执行 mvn clean install
将项目发布到Tomcat服务器
我的项目名称为 my_cxf_restful
访问URL http://localhost:8080/my_cxf_restful/hello/echo/cong 网页显示结果为:

cong

###项目构建步骤 ####导入依赖包 导入jackson 是因为需要处理json类型数据
cxf-rt-frontend-jaxrs 为CXF 开发RESTful WebService 必须的包,其它依赖Maven会自动处理
项目基于Spring

<properties>
        <jackson.version>1.8.6</jackson.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>3.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-client</artifactId>
            <version>3.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-jaxrs</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

####编写RESTful WebService类: 这里并没有写成接口,而是直接写成实现类.
modifyJson方法中框架会将POST请求体的JSON 数据转换成对象JsonBean
注解说明,见下一条目

@Path("/hello")
public class HelloWorld {

    @GET
    @Path("/echo/{input}")
    @Produces("text/plain")
    public String ping(@PathParam("input") String input) {
        return input;
    }

    @POST
    @Produces("application/json")
    @Consumes("application/json")
    @Path("/jsonBean")
    public Response modifyJson(JsonBean input) {
        input.setVal2(input.getVal1());
        return Response.ok().entity(input).build();
    }
}

####注解说明: 本文段引用自http://www.ibm.com/developerworks/cn/opensource/os-restfulwebservices/index.html

(天啊!居然不支持表格)

  • |标签|用法和解释|
  • |@GET,@POST,@PUT,@DELETE| 该组标签将一个标注方法的 HTTP 请求类型|
  • |@Path |该标签可用于类或者方法,表示定位此 RESTful 资源的路径|
  • |@Produces |该标签标注资源类或方法返回的 MIME 类型 , 也就是资源方法产生并且返回给客户端的响应消息的类型。例如 application/xml,application/json.|
  • |@Consumes |该标签标注资源类或方法可以接受的请求消息的类型,也就是客户端发送的请求中可以包含的 Http Entity 的类型。|
  • |@PathParam,@QueryParam,@HeaderParam,@CookieParam |该组分别标注方法的参数来自于 HTTP 请求的不同位置,例如,@PathParam 来自于 URL 的路径,@QueryParam 来自于 URL 的查询参数,@HeaderParam 来自于 HTTP 请求的头信息,@CookieParam 来自于 HTTP 请求的 Cookie。|
  • |@Context |该标签标注资源请求或者响应的上下文实例,例如我们可以再资源方法参数中注入 HttpServletRequest (@Context HttpServletRequest httpRequest) 来获取 Http 请求的相关信息。|

####Spring Bean 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <context:property-placeholder/>
    <context:annotation-config/>
    <bean/>
    <bean/>
    <jaxrs:server id="services" address="/">
        <jaxrs:serviceBeans>
            <bean/>
        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <bean/>
        </jaxrs:providers>
    </jaxrs:server>
</beans>

####Web.xml配置: 与构建一个简单的WebService一样: 使用Spring监听器加载BEAN配置文件;
注册CXF Servlet处理请求.

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
    <display-name>JAX-RS Simple Service</display-name>
    <description>JAX-RS Simple Service</description>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/beans.xml</param-value>
    </context-param>
    <listener>
        <listener-class>
                        org.springframework.web.context.ContextLoaderListener
                </listener-class>
    </listener>
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>
                        org.apache.cxf.transport.servlet.CXFServlet
                </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

####测试

使用FireFox插件Open HTTPRequester post发送json数据
使用方法:使用firefox插件httperrequest,模拟发送及接收Json请求

####更多实例 下载Apache CXF 发布包
查看${CXF_HOME}/simple
例如 ...\apache-cxf-3.1.4\samples\jax_rs\basic

###参考资料: http://www.ibm.com/developerworks/cn/opensource/os-restfulwebservices/index.html
http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf2/index.html

Apache CXF实战之四 构建RESTful Web Service

Apache CXF实战之四 构建RESTful Web Service

这篇文章介绍一下怎么通过CXF来发布RESTful的Web Service.

1. 首先是实体类,注意其中的@XmlRootElement注解

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  1. package com.googlecode.garbagecan.cxfstudy.jaxrs;  

  2.   

  3. import java.util.Date;  

  4.   

  5. import javax.xml.bind.annotation.XmlRootElement;  

  6.   

  7. @XmlRootElement(name="Customer")   

  8. public class Customer {  

  9.     private String id;  

  10.     private String name;  

  11.     private Date birthday;  

  12.     public String getId() {  

  13.         return id;  

  14.     }  

  15.     public void setId(String id) {  

  16.         this.id = id;  

  17.     }  

  18.     public String getName() {  

  19.         return name;  

  20.     }  

  21.     public void setName(String name) {  

  22.         this.name = name;  

  23.     }  

  24.     public Date getBirthday() {  

  25.         return birthday;  

  26.     }  

  27.     public void setBirthday(Date birthday) {  

  28.         this.birthday = birthday;  

  29.     }  

  30.     @Override  

  31.     public String toString() {  

  32.         return org.apache.commons.lang.builder.ToStringBuilder.reflectionToString(this);  

  33.     }  

  34. }  

2. RESTful Web Service接口类,可以通过修改@Produces注解来声明暴露接口返回的json还是xml数据格式

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_2 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  1. package com.googlecode.garbagecan.cxfstudy.jaxrs;  

  2.   

  3. import javax.ws.rs.GET;  

  4. import javax.ws.rs.Path;  

  5. import javax.ws.rs.PathParam;  

  6. import javax.ws.rs.Produces;  

  7. import javax.ws.rs.QueryParam;  

  8.   

  9. @Path (value = "/customer")   

  10. @Produces("*/*")  

  11. //@Produces("application/xml")  

  12. //@Produces("application/json")  

  13. public interface CustomerService {  

  14.     @GET  

  15.     @Path(value = "/{id}/info")  

  16.     Customer findCustomerById(@PathParam("id")String id);  

  17.       

  18.     @GET  

  19.     @Path(value = "/search")  

  20.     Customer findCustomerByName(@QueryParam("name")String name);  

  21. }  

3. RESTful Web Service接口实现类

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_3 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  1. package com.googlecode.garbagecan.cxfstudy.jaxrs;  

  2.   

  3. import java.util.Calendar;  

  4.   

  5. public class CustomerServiceImpl implements CustomerService {  

  6.   

  7.     public Customer findCustomerById(String id) {  

  8.         Customer customer = new Customer();  

  9.         customer.setId(id);  

  10.         customer.setName(id);  

  11.         customer.setBirthday(Calendar.getInstance().getTime());  

  12.         return customer;  

  13.     }  

  14.       

  15.     public Customer findCustomerByName(String name) {  

  16.         Customer customer = new Customer();  

  17.         customer.setId(name);  

  18.         customer.setName(name);  

  19.         customer.setBirthday(Calendar.getInstance().getTime());  

  20.         return customer;  

  21.     }  

  22. }  

4. Server端代码

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_4 name=ZeroClipboardMovie_4 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=4&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  1. package com.googlecode.garbagecan.cxfstudy.jaxrs;  

  2.   

  3. import org.apache.cxf.interceptor.LoggingInInterceptor;  

  4. import org.apache.cxf.interceptor.LoggingOutInterceptor;  

  5. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;  

  6.   

  7. public class MyServer {  

  8.     public static void main(String[] args) throws Exception {  

  9.         JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();  

  10.         factoryBean.getInInterceptors().add(new LoggingInInterceptor());  

  11.         factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());  

  12.         factoryBean.setResourceClasses(CustomerServiceImpl.class);  

  13.         factoryBean.setAddress("http://localhost:9000/ws/jaxrs");  

  14.         factoryBean.create();  

  15.     }  

  16. }  

5. Client端代码

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_5 name=ZeroClipboardMovie_5 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=5&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  1. package com.googlecode.garbagecan.cxfstudy.jaxrs;  

  2.   

  3. import org.apache.commons.httpclient.HttpClient;  

  4. import org.apache.commons.httpclient.HttpStatus;  

  5. import org.apache.commons.httpclient.methods.GetMethod;  

  6.   

  7. public class MyClient {  

  8.   

  9.     public static void main(String[] args) throws Exception {  

  10.         go("http://localhost:9000/ws/jaxrs/customer/1/info");  

  11.         go("http://localhost:9000/ws/jaxrs/customer/search?name=abc");  

  12.     }  

  13.       

  14.     private static void go(String url) throws Exception {  

  15.         HttpClient client = new HttpClient();  

  16.         GetMethod method = new GetMethod(url);  

  17.         int statusCode = client.executeMethod(method);  

  18.         if (statusCode != HttpStatus.SC_OK) {  

  19.             System.err.println("Method failed: " + method.getStatusLine());  

  20.         }  

  21.         byte[] responseBody = method.getResponseBody();  

  22.         System.out.println(new String(responseBody));  

  23.     }  

  24. }  

6.测试

首先运行MyServer类,然后运行MyClient类来验证Web Service。

cxf RESTful Web services 没有WADL

cxf RESTful Web services 没有WADL

cxf RESTful Web services 没有WADL信息?

貌似3.x的版本看不到,我在2.7里面看到,但是我不能确定是不是这样的。

CXF RESTFUL WebService 针对ajax 跨域问题

CXF RESTFUL WebService 针对ajax 跨域问题


重写JSONProvider这个类

public class JsonProvider extends JSONProvider<Object> {

@Context
HttpServletRequest request;


@Override
public void writeTo(Object obj, Class<?> cls, Type genericType,
Annotation[] anns, MediaType m,
MultivaluedMap<String, Object> headers, OutputStream os)

throws IOException {
//获取jsonP传递过来的参数
String prefix = getContext().getHttpServletRequest().getParameter("callback");

boolean hasPrefix = !prefix.isEmpty();
if (hasPrefix) {
os.write(prefix.getBytes(HttpUtils.getSetEncoding(m, headers,"UTF-8")));
os.write(''('');
}
super.writeTo(obj, cls, genericType, anns, m, headers, os);
if (hasPrefix) {
os.write('')'');
}
}

}

配置cxf-restful.xml配置文件

<bean id="jsonProvider"/>

<!-- 配置需要暴露的BeanService -->
<jaxrs:server id="restContainer" address="/spservice">
<jaxrs:serviceBeans>
  <ref bean="menuWebService"/>    
  <ref bean="cpWebService"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
  <ref bean="jsonProvider"/>
</jaxrs:providers>
</jaxrs:server>

关于基于SSM+CXF构建的RESTFul webservice基于ssm架构的项目源码的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Apache CXF 和 Spring 开发RESTful Web Service 2、Apache CXF实战之四 构建RESTful Web Service、cxf RESTful Web services 没有WADL、CXF RESTFUL WebService 针对ajax 跨域问题的相关知识,请在本站寻找。

本文标签: