`
cnoss
  • 浏览: 15530 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

一个Java的Restful服务框架,支持JPA、JAAS、分布式资源对象

阅读更多
项目地址: http://code.google.com/p/jrest4guice/
Demo演示: http://www.rest4g.org/full


当前版本:0.9.0 preview

特点:
  • 基于Google guice
  • 零配置,服务的自动扫描注册
  • 非侵入式,用户不需要实现特定的接口来实现Restful服务,只需要通过@RESTful来声明
  • 支持Post. Get. Put. Delete操作
  • 支持对Get操作的缓存机制,实现动态资源静态化(通过@Cache标注声明)
  • 灵活的注入(支持上下文环境request/response/session以及参数的自动注入)
  • 根据客户端要求返回不同类型的数据(xml/json/html)
  • 通过@PageFlow实现对MVC module2的支持,输出结果支持CTE、Velocity、Freemarker和Spry模板引擎(当返回类型是text/html时才有效)
  • 支持JPA,通过增强的BaseEntityManager实现实体的CRUD
  • 支持事务,通过@Transactional注解声明事务的类型
  • 支持JAAS,通过@RolesAllowed注解声明操作所需要的角色
  • 支持Hibernate validator
  • 支持拦截器 (interceptor)
  • 支持分布式资源对象,实现业务逻辑的分布式部署
  • 提供了与Struts2集成的插件

下一步计划:
  • OSGI的支持
  • 分布式事务的支持

代码示例:
//=======================================================
//资源类
//=======================================================

/**
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 * 联系人的资源对象
 * 声明remoteable为真(可以通过@RemoteReference的注入到任一资源对象,通常用在跨应用的资源调用上)
 */
@RESTful(name = "ContactResource", remoteable = true)
@Path( { "/contact", "/contacts/{contactId}" })
public class ContactResource {
	@Inject
	private ContactService service;//注入联系人管理的服务对象

	/**
	 * 创建新的联系人 
	 * PageFlow :当服务端返回类型是Text/Html类型时,重定向用户的请求到指定的页面,实现最基本功能的MVC。
	 * 		在这里,指明当操作成功时,重定向到/contacts,当操作失败时,将用户请求重定向到/contact。
	 * @param contact 联系人实体
	 */
	@Post
	@PageFlow(success = @PageInfo(value = "/contacts",type=ResultType.REDIRECT)
			,error=@PageInfo(value="/contact",type=ResultType.REDIRECT))
	public String createContact(@ModelBean Contact contact) {
		return this.service.createContact(contact);
	}

	/**
	 * 修改联系人信息 
	 * @param contact 联系人实体
	 */
	@Put
	@PageFlow(success = @PageInfo(value = "/contacts",type=ResultType.REDIRECT)
			,error=@PageInfo(value="/contact",type=ResultType.REDIRECT))
	public void putContact(@ModelBean Contact contact) {
		this.service.updateContact(contact);
	}

	/**
	 * 显示联系人列表 
	 * @param page 页码 
	 * @param size 每页记录数
	 */
	@Get
	@Path("/contacts")
	@PageFlow(success = @PageInfo(value = "/template/contacts.ctl"))
	public Page<Contact> listContacts(int page, int size) {
		return this.service.listContacts(page, size);
	}

	/**
	 * 显示单个联系人的信息 
	 * @param contactId 联系对象ID
	 */
	@Get
	@PageFlow(success = @PageInfo(value = "/template/contactDetail.ctl"))
	public Contact getContact(@Parameter("contactId") String contactId) {
		if(contactId == null)
			return new Contact();
		return this.service.findContactById(contactId);
	}

	/**
	 * 删除指定ID的联系人 
	 * @param contactId 联系对象ID
	 */
	@Delete
	@PageFlow(success = @PageInfo(value = "/contacts",type=ResultType.REDIRECT))
	public void deleteContact(@Parameter("contactId") String contactId) {
		this.service.deleteContact(contactId);
	}
}


//=======================================================
//业务类
//=======================================================

/**
 * 
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 *
 */
@Transactional//事务支持,缺省为TransactionalType.REQUIRED,可以在方法中覆写
@Interceptors({//自定义的拦截器(类级别的,作用于所有的方法,可以在方法中覆写)
	@Interceptor(TestInterceptor.class),
	@Interceptor(LogInterceptor.class)
})
public class ContactService{
	//注入实体管理器
	@Inject
	private BaseEntityManager<String, Contact> entityManager;

	public String createContact(Contact contact) {
		if (contact == null)
			throw new RuntimeException("联系人的内容不能为空");

		if (this.entityManager.loadByNamedQuery("byName", contact.getName()) != null) {
			throw new RuntimeException("联系人的姓名相同,请重新输入");
		}

		this.entityManager.create(contact);
		return contact.getId();
	}

	public void deleteContact(String contactId) {
		String[] ids = contactId.split(",");
		Contact contact;
		for (String id : ids) {
			contact = this.findContactById(id);
			if (contact == null)
				throw new RuntimeException("联系人不存在");
			this.entityManager.delete(contact);
		}
	}

	@Transactional(type=TransactionalType.READOLNY)
	public Contact findContactById(String contactId) {
		return this.entityManager.load(contactId);
	}

	@Transactional(type=TransactionalType.READOLNY)//覆盖类级别的事务类型为只读
	@Interceptor(ListContactsInterceptor.class)//覆盖类级别的拦截器
	public Page<Contact> listContacts(int pageIndex, int pageSize)
			throws RuntimeException {
		return this.entityManager.pageByNamedQuery("list",
				new Pagination(pageIndex, pageSize));
	}

	public void updateContact(Contact contact) {
		if (contact == null)
			throw new RuntimeException("联系人的内容不能为空");
		
		Contact tmpContact = this.entityManager.loadByNamedQuery("byName", contact.getName());
		if(tmpContact != null && !contact.getId().equals(tmpContact.getId()))
			throw new RuntimeException("联系人的姓名相同,请重新输入");

		this.entityManager.update(contact);
	}
}


//=======================================================
//远程调用的案例
//=======================================================

/**
 * 
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 *
 */
@Path( { "/testCallRemote"})
public class TestRemoteResource {
	@Inject
	@RemoteReference//注入远程资源对象
	private ContactResource service;

	@Get
	public Page<Contact> listContacts(int page, int size) {
		return this.service.listContacts(page, size);
	}
}



请大家直接从SVN中获取JRest4Guice工程即可(使用Maven)

真诚希望大家提出宝贵意见,联系方式:
  • Email:zhangyouqun@gmail.com
  • QQ: 86895156
  • MSN: zhangyouqun@hotmail.com
分享到:
评论
41 楼 backbase 2008-07-02  
最近正在学习中,从中受益匪浅,非常棒,永远支持!
40 楼 minidarkey 2008-06-28  
对动态资源静态化的支持确实不错,而且还可以自定义缓存实现。
39 楼 netbeans 2008-06-28  
越来越人性化了,看来不用都不行了。
38 楼 cnoss 2008-06-27  
最新动态

JRest4Guice中增加了对Get方法的缓存机制,实现了对动态资源静态化,从而减少了应用服务器及数据库的访问压力,并大大增强了对SEO的支持。用户可以通过实现ResourceCacheProvider接口来提供自定义的缓存策略。
示例代码:
	@Get
	@PageFlow(success = @PageInfo(url = "/template/contactDetail.vm"))
	@Cache //声明需要缓存结果,可以减少应用服务器及数据库的压力
	public Contact getContact(@Parameter("contactId") String contactId) {
		return this.domain.findContactById(contactId);
	}
37 楼 cnoss 2008-06-26  
Enigma 写道
为什么没有办法访问DEMO网站?


,这几天去外省出差,家里的机器没有打开,所以暂时不能访问。
36 楼 cnoss 2008-06-26  
jeff_yuchang 写道
cnoss 写道
更新通知


大家好,为了提高JRest4Guice的目录结构性以及为1.0版本的发布做准备,特将项目结构做了以下调整。

/JRest4Guice
    /bin                  (代码生成器的执行文件)
    /dos                  (项目文档)
    /src                  (原代码)
       /core              (核心)
       /sample            (示例)
          /full           (完整版,包括JPA)
          /helloWorld     (快速开始)
          /remoteClient   (分布式资源对象的引用测试)
       /tools             (工具)
    pom.xml               (整个项目的配置文件)


原代码地址:http://jrest4guice.googlecode.com/svn/trunk/JRest4Guice



还没看你具体的code和sample,所以不好提意见。
但我觉得用maven目录这么分,是否不太maven way.:)

因为没有了module的东西,
我个人觉得是否 :
--core
--sample
--tools
--docs
...更好些呢?



不好意思现在才回帖,这几天出差去外省了,你的建议很好,我对Maven的使用也很基础,我对整个项目的管理方式也是采用maven的module方式组织的,只是上面的目录结构没有完全展开,在core,sample/full,tools ...下都有一个pom.xml文件来引用顶层的pom.xml。
35 楼 Enigma 2008-06-26  
为什么没有办法访问DEMO网站?
34 楼 jeff_yuchang 2008-06-25  
cnoss 写道
更新通知


大家好,为了提高JRest4Guice的目录结构性以及为1.0版本的发布做准备,特将项目结构做了以下调整。

/JRest4Guice
    /bin                  (代码生成器的执行文件)
    /dos                  (项目文档)
    /src                  (原代码)
       /core              (核心)
       /sample            (示例)
          /full           (完整版,包括JPA)
          /helloWorld     (快速开始)
          /remoteClient   (分布式资源对象的引用测试)
       /tools             (工具)
    pom.xml               (整个项目的配置文件)


原代码地址:http://jrest4guice.googlecode.com/svn/trunk/JRest4Guice



还没看你具体的code和sample,所以不好提意见。
但我觉得用maven目录这么分,是否不太maven way.:)

因为没有了module的东西,
我个人觉得是否 :
--core
--sample
--tools
--docs
...更好些呢?
33 楼 zhyhongyuan 2008-06-20  
219 写道
谢谢了!能不能 把需要的包 也放进去呀! 汗 下一个项目 还要自己找包! 比较


建义你使用Eclipse的J2EE版(带WTP),然后下载Maven的eclipse plugin,使用运行Maven任务下载相关包
32 楼 219 2008-06-20  
谢谢了!能不能 把需要的包 也放进去呀! 汗 下一个项目 还要自己找包! 比较
31 楼 minidarkey 2008-06-20  
收到,建议楼主丰富一下文档,
30 楼 cnoss 2008-06-19  
更新通知


大家好,为了提高JRest4Guice的目录结构性以及为1.0版本的发布做准备,特将项目结构做了以下调整。

/JRest4Guice
    /bin                  (代码生成器的执行文件)
    /dos                  (项目文档)
    /src                  (原代码)
       /core              (核心)
       /sample            (示例)
          /full           (完整版,包括JPA)
          /helloWorld     (快速开始)
          /remoteClient   (分布式资源对象的引用测试)
       /tools             (工具)
    pom.xml               (整个项目的配置文件)


原代码地址:http://jrest4guice.googlecode.com/svn/trunk/JRest4Guice
29 楼 cnoss 2008-06-19  
zhyhongyuan 写道
JRest4Guice试玩,开发工具Eclipse-wtp,web服务器tomcat6,完整单元测试用例。附工程源码!


谢谢热心的zhyhongyuan所给予的支持
28 楼 zhyhongyuan 2008-06-19  
JRest4Guice试玩,开发工具Eclipse-wtp,web服务器tomcat6,完整单元测试用例。附工程源码!
27 楼 cnoss 2008-06-18  
大家好,针对JRest4Guice的代码生成工具JRest4Guice-tools已经发布0.0.1版

功能包括:
  • 创建helloworld的Web样板工程
  • 创建带JPA实现的Web样板工程
  • 创建Restful资源(会自动产生resource/service/entity/junit)


26 楼 zhyhongyuan 2008-06-17  
正在做一个测试项目,与大家共同学习!
25 楼 cnoss 2008-06-16  
yizhuo 写道
看了demo,觉得不错。提点意见

似乎没有测试代码,我个人找不多test case总是觉得很不安全。而且你写些test case后,大概会发现constructor injection比起field injection的优势。


谢谢你的支持,以下是单元测试的代码样例:
	private static UserManageService service;

	@BeforeClass
	public static void setUp() throws Exception {
		//初始化JRest4Guice
		GuiceContext.getInstance().useJPA().init();
		//获取服务
		service = GuiceContext.getInstance().getBean(UserManageService.class);
	}

	@Test
	public void testAuthUser() {
		Assert.assertTrue(service.authUser("cnoss", "123"));
	}



24 楼 Jekey 2008-06-16  
关注,有时间研究一下!
23 楼 yizhuo 2008-06-15  
看了demo,觉得不错。提点意见

似乎没有测试代码,我个人找不多test case总是觉得很不安全。而且你写些test case后,大概会发现constructor injection比起field injection的优势。
22 楼 minidarkey 2008-06-15  
嗯,清除楼主的思路了。期待更多的惊喜!

相关推荐

    Java服务器高级编程

    Java EE(现更名为Jakarta EE)是一个用于构建企业级应用的框架,包括了如EJB(Enterprise JavaBeans)、JPA(Java Persistence API)、JSF(JavaServer Faces)等技术,用于数据库交互、事务管理和服务层设计。...

    Java 服务器高级编程

    4. **Java Persistence API (JPA)**:JPA是Java标准的ORM(对象关系映射)框架,用于简化数据库操作。它允许开发者使用Java对象而不是SQL来操作数据,通过实体类和映射文件实现数据库表的映射。 5. **Java Message ...

    java2企业服务器高级编程

    Hibernate是JPA的一个流行实现,提供了更丰富的功能和更高的性能。 7. **Spring框架**:Spring以其依赖注入和面向切面编程(AOP)理念,成为Java企业级开发的首选框架。Spring还提供了完整的MVC(模型-视图-控制器...

    J2EE帮助文档 Java EE 5.0

    Java EE(以前称为J2EE)是Java平台上用于构建企业级分布式应用程序的框架。它提供了一个标准的、组件化的开发模型,支持多层架构,包括客户端、Web服务器、应用服务器和数据库。Java EE 5.0是这个平台的一个重要...

    Thinking in Enterprise Java

    1. **Java企业版(Java EE)**:Java企业版,也称为Java 2 Platform, Enterprise Edition,是Java平台的一个版本,专为开发和部署多层、分布式、面向服务的Web应用程序而设计。Java EE提供了许多企业级服务,如...

    java ee基础使用教程

    Java EE(Java Platform, Enterprise Edition)是Java平台上用于构建企业级Web应用的框架集合,它提供了丰富的服务和组件,使得开发者能够快速开发出分布式、多层架构的应用程序。本教程由知名讲师郑阿奇编著,旨在...

    Java EE 5 Tutorial (PDF文件)

    J2EE(Java 2 Platform, Enterprise Edition)是一个用于构建分布式、多层的企业级应用程序的框架,它提供了各种服务和API,便于开发人员快速构建可扩展且健壮的应用。 在Java EE 5中,有几个关键的知识点值得我们...

    Java_Web整合开发王者归来_16

    2. **Java EE(企业版)**:包括了诸如EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)等组件,它们提供了一套完整的框架来构建分布式、多层的企业级应用。 3. **Spring...

    java EE水果管理系统 Java学习资料

    通过这个“Java EE水果管理系统”的学习,你可以深入了解Java EE的各个组成部分,并学会如何将它们组合在一起构建一个完整的应用。实践中,你需要理解和配置应用服务器(如Tomcat、WildFly),编写Java代码,设置...

    java试题第一套

    J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专为构建分布式、多层的企业级应用程序而设计。在J2EE试题中,我们通常会看到以下几个核心知识点: 1. **Java基础知识**:这是所有J2EE学习的...

    java购物车系统

    Java提供了JTA(Java Transaction API)和JPA(Java Persistence API)来支持分布式事务处理。 4. **并发控制**:在高并发场景下,多个用户可能会同时操作同一购物车,因此需要处理并发问题。Java提供了...

    轻量级Java EE企业应用实战(第3版)04pdf

    Java EE(Java Platform, Enterprise Edition),是Java平台的一个版本,专为构建企业级应用而设计。它提供了大量的API和服务,包括但不限于:Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)、JMS...

    345_Java电子政务系统_网站调查_便民信息服务系统.rar

    4. 安全性:Java提供了一系列的安全机制,如JAAS(Java Authentication and Authorization Service)用于用户身份验证和权限管理,SSL/TLS协议支持加密通信,防止数据泄露。此外,还可以利用Java的过滤器(Filter)...

    J2EE框架(笔记)

    - **JPA(Java Persistence API)**:提供了ORM(对象关系映射)框架,如Hibernate,使Java对象可以透明地映射到数据库表。 5. **Web服务** - **JAX-WS(Java API for XML Web Services)**:用于创建和消费SOAP...

    2019年JAVAEE全套视频.zip

    最后,Java EE的安全性也是一个重要的主题,包括认证和授权机制,如JAAS(Java Authentication and Authorization Service),以及HTTPS、SSL/TLS等网络安全协议的应用。 2019年的黑马JAVA EE全套视频,很可能是...

    java教程\TSG-J2 J2EE高级课程和演示代码

    7. **JPA(Java Persistence API)**:JPA是Java标准的ORM(Object-Relational Mapping)框架,用于处理Java对象和关系数据库之间的映射。教程可能涵盖实体类的定义、持久化上下文的使用以及查询语言JQL。 8. **Web...

    Java EE 6 标准与规范(中文版)

    Java EE 6 提供了一个强大的事务管理框架,支持分布式事务。 **3.2 标准** - **JTA 1.1**:定义了事务服务接口。 - **JTS 1.1**:提供了一个事务服务的参考实现。 **3.3 事务的互用性** 支持与其他Java EE版本的...

    精通J2EE pdf

    8. **Java Transaction API (JTA)**:JTA为应用程序提供了一个统一的事务管理接口,支持分布式事务处理,确保数据的一致性。 9. **Java Authentication and Authorization Service (JAAS)**:JAAS提供了安全框架,...

    Java ee试卷两份

    Java EE,全称为Java Platform, Enterprise Edition,是Java平台针对企业级应用开发的版本,它提供了丰富的组件和服务,用于构建分布式、多层的企业系统。这两份试卷,"Java_EEB卷.doc"和"JAVA_EE期末复习参考题.doc...

    《J2EE应用框架设计与项目开发》

    J2EE(Java Platform, Enterprise Edition)是一个用于开发和部署多层分布式应用程序的平台,它提供了丰富的API和服务,以支持各种企业级功能,如事务管理、安全性、数据库连接池和消息队列等。 在J2EE应用框架设计...

Global site tag (gtag.js) - Google Analytics