阅读更多
项目地址: 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的支持
  • 分布式事务的支持

代码示例:
/**
 * 
 * @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
18
1
评论 共 12 条 请登录后发表评论
12 楼 rox 2010-01-07 21:39
恩,不错,和Restlet相似,有兴趣。
11 楼 cnoss 2008-06-18 17:31
针对JRest4Guice的代码生成工具JRest4Guice-tools 已经发布0.0.1版,功能包括:
  • 创建helloworld的Web样板工程
  • 创建带JPA实现的Web样板工程
  • 创建Restful资源(会自动产生resource/service/entity/junit)


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

可执行文件在dist目录下,具体使用请大家按照程序的向导进行,谢谢大家的关注。

10 楼 helyho 2008-06-16 15:46
我觉没有什么特别的优势.
使用接口是为了,servlet的或者是服务的同一性,这样带来的是人员变更后维护的易入手
而使用注解每个人的方式不同,业务逻辑和请求处理类分的不清晰,还有就是注解让人看的比较容易晕,他的结构性太差.
我的个人观点
对模板的支持挺不错.
9 楼 lisanping 2008-06-16 14:34





8 楼 zhyhongyuan 2008-06-16 12:56
我用jrest4guice做了一个小项目,感觉不错,开发速度快,继续支持!
7 楼 cnoss 2008-06-16 12:12
有什么问题可以通过QQ、MSN和我联系
6 楼 Frederick 2008-06-16 11:24
不好意思,对maven不熟悉,所以先前没看项目里面的pom.xml文件。现在知道需要那些版本的jar包了
5 楼 Frederick 2008-06-16 10:56
想问一下,你的项目用的asm.jar是那个版本的?似乎3.0和3.1都不对,无法编译通过。

主要出错代码在于ParameterNameDiscoverer.java的76行和83行。

3.0/3.1的classReader.accept()是这样的:public void accept(final ClassVisitor classVisitor, final int flags),你的调用通不过啊:
classReader.accept(classVisitor, false)
4 楼 jacky_yin 2008-06-16 09:15
有很多新的特性,非常吸引人,希望楼主继续努力,赞一个!
3 楼 sinoyster 2008-06-16 08:52
非常不错 
2 楼 minidarkey 2008-06-15 23:17
,确实不错,我也一直都在跟进
1 楼 zjumty 2008-06-15 22:10
不错不错, 赞!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • cl命令-编译c语言汇编程序

    主要用到VC16目录下的cl.exe,用以编译c文件,形成obj文件,借助dos环境下的link命令可以生成com文件

  • Visual Stdio C/C++的汇编代码的输出

    本文章讲解了在vs2019中得到C/C++代码的汇编形式的方法

  • x64平台下VC++中汇编函数的编写问题

    x86平台上,可以利用asm关键字在在C++代码中直接编写汇编语句,而在x64平台上,VC++不再支持asm关键字,不能在代码中内嵌汇编了。这时候,你需要将那部分汇编代码单独编写成ASM文件,编译生成.obj文件后附加到C++工程中。 将C++代码中原来的汇编部分单独编写成ASM文件,需要注意参数传递的问题,前4个参数按照从左到右的顺序用rcx,rdx,r8,r9传递,剩下的参数从右到左用栈传递

  • 如何查看cl编译器生成的汇编代码

    显然,直接在vs2005的Disassembly窗口中查看是不方便的。其实,cl.exe提供了一个/FAs的编译选项,而添加这一选项最简单的办法为:首先找到“项目属性->Configuration Properties->C/C++->Command Line->Addtional options”,然后在其中添入"/FAs",然后F5编译,继而在源程序的同一目录下,便可找到对应的

  • vc++ 中开发汇编语言 

    https://www.21ic.com/tougao/article/7569.html https://www.cnblogs.com/rixiang/p/5589301.html 1: vc++ 中开发汇编语言 汇编程序结构 一个显示字符串的汇编程序程序格式 一、模式定义二、includelib语句三、函数声明语句四、数据和代码部分Visual C/C++环境 建立工程汇编程序...

  • 让VC++直接生成汇编代码

    让VC++直接生成汇编代码1)    选择菜单工程(Project)设置(Settings),2)    选择C/C++标签,然后在分类(Category)中选择Listing Files,然后在列表文件类型(Listing file type)选择Assembly with Source code这样设置之后就可以输出汇编代码了。3)    编译----执行后,我们看到Debug目录已生成了对应...

  • VC下生成汇编代码的方法:

    生成汇编代码的方法: debug方式下: vc8 下面是: Project- > ...Properties - > C/C++ - > OutputFiles:选择右边的Assembler Output vc6 下面是: Project Settings - > C/C++ - > Listing Files 选择Listing File Types 输出: vc8 在debug目录下的

  • VC6.0如何生成汇编文件并显示编译选项

    使用了比较久VC6.0,但是从来没有关注过VC的详细编译过程,刚好同事这两天做反编译工作,所以就查了一下VC的编译工具cl的编译设置。 下面简单的说两个我自己比较关注的问题: 1、让VC在编译过程显示详细的参数(去掉/nologo): 那么,编译过成的输出如下: --------------------Configuration: test - Win32 Debug----...

  • VC汇编(二)

    一些常见的基础寄存器 8086

  • 实验1 Windows汇编语言开发环境

    实验1  Windows汇编语言开发环境Windows、Linux等现代操作系统都运行于CPU的保护模式下。学习保护模式的汇编语言编程,要选用合适的编译、调试工具,编译工具决定了汇编程序的语法、结构,而调试工具则能够帮助我们迅速查找程序中的错误,提高调试效率。本实验指导书采用Microsoft公司的MASM 6.14作为编译工具,Microsoft Visual C/C++作为开发调试环境

  • C编译器剖析_6.3.1 汇编代码生成_由中间指令产生汇编代码的主要流程

    6.3.1  由中间指令产生汇编代码的主要流程     在这一小节,我们可把关注的焦点放在“如何把某条中间代码翻译成汇编代码”上。UCC编译器的中间代码是如下所示的四元式,包括运算符和3个操作数。              当然有些中间代码只需要用到opcode和DST就可以了,例如,无条件跳转指令“goto  BB2;”就不需要SRC1和SRC2。为了便于汇编代码的生成,UCC编译器在u

  • VC下生成C/C++对应汇编源代码

    打开一个C/C++源代码文件,工程-设置-C/C++-分类:文件列表-列表文件类型:Assembly with source code   确定 编译之后,会在debug目录下,生成同名的.asm文件,即该程序对应的汇编源代码。 比如下面这段简单的C++程序: #include using namespace std; void main( ) {

  • VC写汇编的两种方式

      1 是传统的用MASM32的ML.exe做编译器汇编纯粹ASM文件,比如VC工程里有几个ASM文件,在file view面板里右键点击一个ASM文件,在弹出菜单里选Custom Build选项,弹出Custom Build对话筐,在里面输入Ml的命令行就可以了,这中方式写ASM文件的语法和用MASM32完全一样(可以得到一个程序使用多个ASM的好处),即用关键字标示语句、语句块等

Global site tag (gtag.js) - Google Analytics