欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  资讯频道

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

程序员文章站 2022-05-08 09:07:40
...
项目地址: 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