`
jusescn
  • 浏览: 125303 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
项目地址: http://code.google.com/p/jrest4guice/
Demo演示: http://cnoss.vicp.net/


当前版本:0.9.0 preview

特点:
  • 基于Google guice
  • 零配置,服务的自动扫描注册
  • 非侵入式,用户不需要实现特定的接口来实现Restful服务
  • 支持Post. Get. Put. Delete操作
  • 灵活的注入(支持上下文环境request/response/session以及参数的自动注入)
  • 根据客户端要求返回不同类型的数据(xml/json/html)
  • 支持Velocity、Freemarker和Spry模板引擎(当返回类型是text/html时才有效,参见@ViewTemplate)
  • 支持JPA,通过增强的BaseEntityManager实现实体的CRUD
  • 支持事务,通过@Transactional注解声明事务的类型
  • 支持JAAS,通过@RolesAllowed注解声明操作所需要的角色
  • 支持分布式资源对象,实现业务逻辑的分布式部署


下一步计划:

  • OSGI的支持
  • 分布式事务的支持


代码示例:

Java代码 复制代码
  1. /**  
  2.  *   
  3.  * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>  
  4.  * 联系人的资源对象,并声明为Remote(可以通过@RemoteService的注入到任一资源对象,通常用在跨应用的资源调用上)  
  5.  */  
  6. @Path( { "/contact""/contacts/{contactId}" })   
  7. @Remote  
  8. public class ContactResource {   
  9.     @Inject  
  10.     private ContactService service;   
  11.   
  12.     /**  
  13.      * 创建新的联系人  
  14.      * contact 联系人实体  
  15.      */  
  16.     @Post  
  17.     public String createContact(@ModelBean Contact contact) {   
  18.         return this.service.createContact(contact);   
  19.     }   
  20.   
  21.     /**  
  22.      * 修改联系人信息  
  23.      * contact 联系人实体  
  24.      */  
  25.     @Put  
  26.     public void putContact(@ModelBean Contact contact) {   
  27.         this.service.updateContact(contact);   
  28.     }   
  29.   
  30.     /**  
  31.      * 显示联系人列表,并限定服务所支持的返回数据类型只能为application/json和application/javabean  
  32.      * pageIndex 页码  
  33.      * pageSize 每页记录数  
  34.      */  
  35.     @Get  
  36.     @ProduceMime( {MimeType.MIME_OF_JSON,MimeType.MIME_OF_JAVABEAN})   
  37.     @Path("/contacts")   
  38.     public Page<Contact> listContacts(int pageIndex, int pageSize) {   
  39.         return this.service.listContacts(pageIndex, pageSize);   
  40.     }   
  41.   
  42.     /**  
  43.      * 显示单个联系人的信息  
  44.      * 并指定了当客户端请求类型为text/html时的视图显示模板(现在系统内置对Velocity、Freemarker与Spry的支持)  
  45.      * contactId 联系对象ID  
  46.      */  
  47.     @Get  
  48.     @ViewTemplate(url="/template/contactDetail.vm",render=ViewRenderType.VELOCITY)   
  49. //  @ViewTemplate(url="/template/contactDetail.ftl",render=ViewRenderType.FREEMARKER)   
  50. //  @ViewTemplate(url="/template/contactDetail.html",render=ViewRenderType.SPRY)   
  51.     public Contact getContact(@Parameter("contactId") String contactId) {   
  52.         return this.service.findContactById(contactId);   
  53.     }   
  54.   
  55.     /**  
  56.      * 删除指定ID的联系人  
  57.      * contactId 联系对象ID  
  58.      */  
  59.     @Delete  
  60.     public void deleteContact(@Parameter("contactId") String contactId) {   
  61.         this.service.deleteContact(contactId);   
  62.     }   
  63. }   
  64.   
  65. /**  
  66.  * 业务对象  
  67.  * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>  
  68.  *  
  69.  */  
  70. @SuppressWarnings({"unchecked""unused"})   
  71. public class ContactServiceBean implements ContactService {   
  72.   
  73.     private BaseEntityManager<String, Contact> entityManager;   
  74.   
  75.     @Inject  
  76.     private void init(EntityManager em) {   
  77.         this.entityManager = new BaseEntityManager<String, Contact>(   
  78.                 Contact.class, em);   
  79.     }   
  80.   
  81.     @Transactional  
  82.     @RolesAllowed({"user"})//权限声明   
  83.     public String createContact(Contact contact) {   
  84.         if (contact == null)   
  85.             throw new RuntimeException("联系人对象不能为空");   
  86.   
  87.         if (this.entityManager.loadByNamedQuery("byName", contact.getName()) != null) {   
  88.             throw new RuntimeException("联系人的姓名相同,请重新输入");   
  89.         }   
  90.   
  91.         this.entityManager.create(contact);   
  92.         return contact.getId();   
  93.     }   
  94.   
  95.     @Transactional  
  96.     @RolesAllowed({"admin","audit"})//权限声明   
  97.     public void deleteContact(String contactId) {   
  98.         String[] ids = contactId.split(",");   
  99.         Contact contact;   
  100.         for (String id : ids) {   
  101.             contact = this.findContactById(id);   
  102.             if (contact == null)   
  103.                 throw new RuntimeException("联系人不存在");   
  104.             this.entityManager.delete(contact);   
  105.         }   
  106.     }   
  107.   
  108.     @Transactional(type=TransactionalType.READOLNY)//只读性的事务   
  109.     public Contact findContactById(String contactId) {   
  110.         return this.entityManager.load(contactId);   
  111.     }   
  112.   
  113.     @Transactional(type=TransactionalType.READOLNY)   
  114.     public Page<Contact> listContacts(int pageIndex, int pageSize)   
  115.             throws RuntimeException {   
  116.         return this.entityManager.pageByNamedQuery("list",   
  117.                 new Pagination(pageIndex, pageSize));   
  118.     }   
  119.   
  120.     @Transactional  
  121.     @RolesAllowed({"admin","user"})//权限声明   
  122.     public void updateContact(Contact contact) {   
  123.         if (contact == null)   
  124.             throw new RuntimeException("联系人对象不能为空");   
  125.   
  126.         this.entityManager.update(contact);   
  127.     }   
  128. }   
  129.   
  130.   
  131. /**  
  132.  * 远程资源引用的示例  
  133.  * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>  
  134.  *   
  135.  */  
  136. @Path({"/testCallRemote"})   
  137. public class TestRemoteResource {   
  138.     @Inject  
  139.     @RemoteService //注入远程资源对象的引用   
  140.     private ContactResource service;   
  141.   
  142.     @Get  
  143.     @ProduceMime( {MimeType.MIME_OF_JSON,MimeType.MIME_OF_JAVABEAN})   
  144.     public Page<Contact> listContacts(int pageIndex, int pageSize) {   
  145.         return this.service.listContacts(pageIndex, pageSize);   
  146.     }   
  147. }  
/**
 * 
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 * 联系人的资源对象,并声明为Remote(可以通过@RemoteService的注入到任一资源对象,通常用在跨应用的资源调用上)
 */
@Path( { "/contact", "/contacts/{contactId}" })
@Remote
public class ContactResource {
	@Inject
	private ContactService service;

	/**
	 * 创建新的联系人
	 * contact 联系人实体
	 */
	@Post
	public String createContact(@ModelBean Contact contact) {
		return this.service.createContact(contact);
	}

	/**
	 * 修改联系人信息
	 * contact 联系人实体
	 */
	@Put
	public void putContact(@ModelBean Contact contact) {
		this.service.updateContact(contact);
	}

	/**
	 * 显示联系人列表,并限定服务所支持的返回数据类型只能为application/json和application/javabean
	 * pageIndex 页码
	 * pageSize 每页记录数
	 */
	@Get
	@ProduceMime( {MimeType.MIME_OF_JSON,MimeType.MIME_OF_JAVABEAN})
	@Path("/contacts")
	public Page<Contact> listContacts(int pageIndex, int pageSize) {
		return this.service.listContacts(pageIndex, pageSize);
	}

	/**
	 * 显示单个联系人的信息
	 * 并指定了当客户端请求类型为text/html时的视图显示模板(现在系统内置对Velocity、Freemarker与Spry的支持)
	 * contactId 联系对象ID
	 */
	@Get
	@ViewTemplate(url="/template/contactDetail.vm",render=ViewRenderType.VELOCITY)
//	@ViewTemplate(url="/template/contactDetail.ftl",render=ViewRenderType.FREEMARKER)
//	@ViewTemplate(url="/template/contactDetail.html",render=ViewRenderType.SPRY)
	public Contact getContact(@Parameter("contactId") String contactId) {
		return this.service.findContactById(contactId);
	}

	/**
	 * 删除指定ID的联系人
	 * contactId 联系对象ID
	 */
	@Delete
	public void deleteContact(@Parameter("contactId") String contactId) {
		this.service.deleteContact(contactId);
	}
}

/**
 * 业务对象
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 *
 */
@SuppressWarnings({"unchecked", "unused"})
public class ContactServiceBean implements ContactService {

	private BaseEntityManager<String, Contact> entityManager;

	@Inject
	private void init(EntityManager em) {
		this.entityManager = new BaseEntityManager<String, Contact>(
				Contact.class, em);
	}

	@Transactional
	@RolesAllowed({"user"})//权限声明
	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();
	}

	@Transactional
	@RolesAllowed({"admin","audit"})//权限声明
	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)
	public Page<Contact> listContacts(int pageIndex, int pageSize)
			throws RuntimeException {
		return this.entityManager.pageByNamedQuery("list",
				new Pagination(pageIndex, pageSize));
	}

	@Transactional
	@RolesAllowed({"admin","user"})//权限声明
	public void updateContact(Contact contact) {
		if (contact == null)
			throw new RuntimeException("联系人对象不能为空");

		this.entityManager.update(contact);
	}
}


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

	@Get
	@ProduceMime( {MimeType.MIME_OF_JSON,MimeType.MIME_OF_JAVABEAN})
	public Page<Contact> listContacts(int pageIndex, int pageSize) {
		return this.service.listContacts(pageIndex, pageSize);
	}
}



请大家直接从SVN中获取JRest4Guice、JRest4Guice-sample、libraries三个工程即可

真诚希望大家提出宝贵意见,联系方式:

  • Email:zhangyouqun@gmail.com
  • QQ: 86895156
  • MSN: zhangyouqun@hotmail.com
分享到:
评论

相关推荐

    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