`
徜徉の小溪
  • 浏览: 448676 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于RESTful Web Service 的Jersey框架与Spring完美整合

阅读更多

      前几天一时兴起,看到一个基于RESTful web Service的很不错的框架 jersey .并且做了一个小小的案例.

 说起jersey,应该首先简要的阐述一下REST,REST概念是由加州大学的Roy Fielding 在2000年提出,REST不是一种技术,它是一种开发方式和风格,REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态,也已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。而Jersey是一个REST 很好的轻量级实现框架.

     刚听说jersey的时候,我并不是很倾向,因为在此之前基于RESTful的实现框架有很多,比如XFire,Restlet,Resteasy等等,但我还是使用了之后,觉得它与Spring完美集成,让我们在开发中提高了很多小于,也相对的减少非法侵入.

    下面我们来搭建一个jersey的web service Project:

   我的IDE环境是myeclipse,jre 在jdk1.6上  web 服务器是tomcat 6

      一、第一步新建一个web project 。

      二、然后将相关的spring  jar包导入项目中, spring-core,aop,beans,jdbc,context,asm,orm,web等去官网下载http://www.springsource.org/download/  list  中所有的jar包

     三、下载jersey 相关的jar包

           

 

    四、 导入aopalliance.jar 不然会报错 找不到相关文件,log4j jar 和log4j.properties

    五、  创建自己的应用程序

 

 

 

 

我现在直接写一个helloworld对象 将helloworl 对象通过webservice 访问来返回相关数据格式的数据

 

 

package com.jerrys.jerseyrest.entity;


import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Helloworld implements Serializable {
	private String content;
	private Map<String, Object> helloMap = new HashMap<String, Object>();

	public Helloworld() {
		helloMap.put("xiaoming", "我是小明:");
		helloMap.put("xiaoqiang", "我是小强:");
	}

	public Object getHelloByName(String name) {
		return helloMap.get(name);
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public Map<String, Object> getHelloMap() {
		return helloMap;
	}

	public void setHelloMap(Map<String, Object> helloMap) {
		this.helloMap = helloMap;
	}

}
 

 

 

@XmlRootElement 是jax-rs中 提供将对象的属性绑定返回时将已json或者xml等数据返回.

 

 

 

package com.jerrys.jerseyrest.webservice;

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

import org.apache.log4j.Logger;

import com.jerrys.jerseyrest.entity.Helloworld;

@Path("/helloService")
public class HelloRestService {
	public static Logger log = Logger.getLogger(HelloRestService.class);

	/**
	 * 获取helloworld
	 */
	@GET
	@Path("/hello")
	@Produces( { MediaType.APPLICATION_JSON })
	public Helloworld getHelloworld() {
		Helloworld hi = null;
		try {
			hi = new Helloworld();

			hi.setContent((String) hi.getHelloByName("xiaoqiang"));

		} catch (Exception e) {
			log.error(e.getMessage(), e);
			e.printStackTrace();
		}
		return hi;
	}
}
 

 

       @Path("/helloWervice")  是你访问该HelloRestService 资源的uri 标识对应的url访问路径是: http://localhost:8080/projectName/helloWervice

 

      @Path(/hello) 是  HelloRestService  中getHelloworld()方法上是访问该方法资源的uri标识,对应的url路径是

http://localhost:8080/projectName/helloWervice/hello

 

我们可以定义该方法是用来获取资源数据的所以我们可以定义成@GET,如果是@PUT那就是更新,@DELETE是删除资源,@POST创建。也可以叠加

 

  @Produces({ MediaType.APPLICATION_JSON }定义了我们返回的数据格式.这边我们直接用的变量,我们也可以直接写"application/xml","application/json","text/html"

 

当然我们也可以定义参数@PathParam("name") 定义传值的参数

 

 

 

接下来我们来配置Web.xml  

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<display-name>jax-rs</display-name>
	<!-- Helps locate the applicationContext.xml file -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<listener>
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>
	<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>
	<!-- Configuration for Jersey Web Services starts here -->
	<servlet>
		<servlet-name>jersey</servlet-name>
		<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
		<init-param>
			<param-name>com.sun.jersey.config.property.packages</param-name>
			<!-- The package in which the Resource classes located-->
			<param-value>com.jerrys.jerseyrest.webservice</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>jersey</servlet-name>
		<!--
			Enables us to access the WS by pointing your browser to this URL :
			http://localhost:8080/any_name/{service-path}
		-->
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
	<!-- Configuration for Jersey Web Services ends here -->
	<session-config>
		<session-timeout>10</session-timeout>
	</session-config>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 

加载jersey  和Srping 的servlet

 

 

然后在创建 applicationContext.xml 的spring配置文件

 

   <?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	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://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
	default-lazy-init="true" >
	<!-- 使用Annotation(注解)自动注册Bean(自注入) ,并检查@Required,@Autowired的属性已被注入 -->
	<context:component-scan base-package="com.jerrys.jerseyrest"></context:component-scan>
	<!-- JOTM本地实例 -->
	<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />

	<bean id="txManager"
		class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="userTransaction" ref="jotm"></property>
	</bean>


	<bean id="jta1Datasource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
		destroy-method="shutdown">
		<property name="dataSrouce">
			<bean class="org.enhydra.jdbc.standard.StandardXADataSource"
				destroy-method="shutdown">
				<property name="transactionManager" ref="jotm" />
				<property name="driverName" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://192.168.1.20:3306/jtatest1" />

			</bean>
		</property>
		<property name="user" value="root"></property>
		<property name="password" value="zgjf168"></property>
	</bean>



	<bean id="jta2Datasource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
		destroy-method="shutdown">
		<property name="dataSrouce">
			<bean class="org.enhydra.jdbc.standard.StandardXADataSource"
				destroy-method="shutdown">
				<property name="transactionManager" ref="jotm" />
				<property name="driverName" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://192.168.1.20:3306/jtatest2" />

			</bean>
		</property>
		<property name="user" value="root"></property>
		<property name="password" value="zgjf168"></property>
	</bean>

	<bean id="jta1Template" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="datasource" ref="jta1Datasource" />
	</bean>
	<bean id="jta2Template" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="datasource" ref="jta2Datasource" />
	</bean>

	<!-- 注解事务驱动 -->
	<tx:annotation-driven transaction-manager="txManager"
		proxy-target-class="true" />
</beans>

 

 

  我在jersey与spring整合同时,我也提到了使用JTA分布式事务 的配置,但这边只是一个案例,仅提供参考,所以没有集成整合Hibernate  所以请包涵.

 

 

 

  对于JTA分布式事务  的详细概念  我在这就不一一阐述了.请参见http://www.ibm.com/developerworks/cn/webservices/ws-transjta/

 

 

 

功能还待完善,如有不正确的观点,请予以点评.

 

 

分享到:
评论
3 楼 徜徉の小溪 2017-01-12  
yuanliangding 写道
请求进来时,
创建的对象都不是由Spring弄出来的。。



首先你可以先去了解一下JAX-WS 和JAX-RS  JSR311 Standard
创建的对象Spring MVC 也是遵循的 JAX-RS 规范  我
Jersey 也是。
你的对象上加入 @XmlRootElement 这个注解自动会帮你传进来的json数据 进行封装成对象
The @XmlRootElement annotation can be used with the following program elements:

2 楼 yuanliangding 2017-01-05  
请求进来时,
创建的对象都不是由Spring弄出来的。。
1 楼 linzhichao12345 2015-01-16  
求教一个问题,如果我想过滤静态资源,该怎么配置?

相关推荐

    使用SpringBoot整合jersey 实现Restful web service.同时整合springmvc。

    在本文中,我们将深入探讨如何使用SpringBoot框架与Jersey集成来实现RESTful Web服务,并同时整合Spring MVC。SpringBoot以其简洁的配置和快速的开发能力受到广大开发者的喜爱,而Jersey作为JAX-RS规范的实现,是...

    spring jersey整合后无法注入

    在IT行业中,Spring框架是Java开发中的一个基石,它提供了丰富的功能来简化应用程序的构建,而Jersey则是实现RESTful Web服务的一种流行选择。当尝试将Spring与Jersey整合时,可能会遇到“无法注入”的问题,这通常...

    Jersey+spring Demo

    【标题】"Jersey+Spring Demo" 是一个基于Java的Web服务开发实例,它整合了两个重要的技术框架:Jersey和Spring。这个示例旨在帮助开发者理解如何在J2EE环境中构建RESTful Web服务,同时利用Spring框架进行依赖注入...

    Spring4整合Jersey2.9

    在本文中,我们将深入探讨如何将Spring4框架与Jersey2.9进行集成,以便创建一个功能丰富的RESTful Web服务。这个入门案例采用Maven作为项目构建工具,使得整个过程更加简便。 首先,理解Spring4和Jersey2.9的核心...

    Jersey Spring4 Freemarker HIbernate整合搭建

    首先,Jersey是Java的一个轻量级RESTful Web服务框架,它基于JAX-RS(Java API for RESTful Web Services)标准。通过使用Jersey,开发者可以轻松地创建HTTP服务,提供JSON或XML格式的数据。它允许通过注解来定义...

    jersey整合spring示例,亲测可行

    通过以上步骤,我们可以成功地将 Jersey 和 Spring 整合在一起,利用 Spring 提供的依赖注入、事务管理等特性,同时利用 Jersey 实现 RESTful Web 服务。这个过程可能会遇到一些问题,但只要按照正确的步骤和方法,...

    jersey+spring+srpingmvc实现上传

    Jersey是Java RESTful Web服务的实现,而Spring MVC是Spring框架的一部分,专门用于构建Web应用。HTTP服务器在其中扮演了接收和处理客户端请求的角色。 【描述】:“代码来自互联网,经过整理测试可用;大家注意里面...

    spring加载restful(文档+程序源码)

     在Spring框架支持REST之前,人们会使用其他几种实现技术来创建Java RESTful Web Services,如Restlet、RestEasy和Jersey。Jersey是其中最值得注意的,它是JAX-RS(JSR 311)的参考实现。  Spring是一个得到广泛...

    基于jersey2.26_spring4+hibernate5+mysql的整合学习.zip

    【标题】"基于jersey2.26_spring4+hibernate5+mysql的整合学习.zip" 提供了一个综合性的学习资源,旨在教授如何将三个关键的技术框架——Jersey 2.26、Spring 4 和 Hibernate 5 整合在一起,并与 MySQL 数据库进行...

    Spring4 Hibernate4 jersey项目源码

    《Spring4 Hibernate4 Jersey项目源码...通过深入分析源码,开发者可以学习到如何将这些框架有效地整合在一起,以及如何设计和实现基于JSON的RESTful API,这对于提升个人在Java Web开发领域的专业技能具有重要意义。

    jersey+spring+mybatis框架初使用

    本教程将引导初学者了解如何整合jersey、spring和mybatis这三个强大的开源框架,以实现基本的CRUD(创建、读取、更新和删除)操作。这些框架的结合提供了高效、灵活且可扩展的后端解决方案。 首先,让我们逐一介绍...

    JAVA+Spring+Hibernate使用Jersey开发Rest_WEB_SERVICE

    在本文中,我们将深入探讨如何使用Java、Spring和Hibernate结合Jersey框架来开发RESTful Web服务。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,它基于HTTP协议,利用URI...

    ssh rest ws jax-rs jersey 做的小网站后台及web service接口

    SSH(Spring、Struts、Hibernate)是Java Web开发中常见的三层架构,它整合了Spring的依赖注入、Struts的MVC模式和Hibernate的对象关系映射,提供了一种高效、灵活的开发框架。在本项目中,SSH框架被用来构建网站...

    Jersey+Spring集成,后台接受或返回Json数据

    在Java世界中,Jersey和Spring是两个非常重要的框架,它们分别用于构建RESTful Web服务和企业级应用程序。本文将详细介绍如何将Jersey与Spring进行集成,以便在后台处理JSON数据。我们将探讨以下知识点: 1. **...

    考试类精品--online-exam-backend是一个在线考试系统的后端模块。基于Jersey+Spring实现.zip

    一、Jersey框架 Jersey是Java RESTful Web服务的开源实现,它是JAX-RS规范的一部分。REST(Representational State Transfer)是一种轻量级的网络应用程序设计风格,它强调资源的表述和状态转移,使得客户端和...

    jersey所需jar包

    Jersey 是一个开源的、基于 Java 的 RESTful Web 服务客户端和服务器框架,它使得开发者可以轻松地创建和部署 RESTful 服务。本压缩包文件包含的是 Jersey 框架运行所需的 JAR 包,这些库文件对于构建和运行基于 ...

    Jersey Spring Hibernate

    **Jersey** 是Java中实现RESTful Web服务的主要框架之一,它基于JAX-RS(Java API for RESTful Web Services)标准。Jersey提供了API和工具来创建、部署和消费RESTful服务。通过使用注解,开发者可以轻松地将HTTP...

    Spring整合CXF,发布RSETful 风格WebService

    在本文中,我们将探讨如何将Spring与Apache CXF框架整合,以发布RESTful风格的Web服务。RESTful Web服务是一种轻量级的架构风格,它基于HTTP协议,使用URI(Uniform Resource Identifier)来定位资源,通过HTTP方法...

    rest+spring+webservice交互xml文件

    这些库通常包括处理REST请求和响应的核心组件,如JAX-RS(Java API for RESTful Web Services)的实现,例如Jersey。在本例中,你需要选择四个依赖库,这些库可能包含了处理REST请求、响应、XML解析等功能。 第二步...

Global site tag (gtag.js) - Google Analytics