My favorites | Sign in
Project Logo
                
Code license: Apache License 2.0
Labels: Rest, Guice, JPA, Java, Restful
Feeds:

jrest4guice is a lightweight、Restful service framework, and it supports JPA、JAAS and distributed resource object.


Features:

Code example:

//=======================================================
//resource class
//=======================================================

/**
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 * resource object of the contact
 * set remoteable to true(use @RemoteReference annotation to inject into any 
 * resource object, and it usually used to resource invoke between cross-applications)
 */
@RESTful(name = "ContactResource", remoteable = true)
@Path( { "/contact", "/contacts/{contactId}" })
public class ContactResource {
	@Inject
	private ContactService service;//inject contact management service

	/**
	 * create a new contact
	 * PageFlow : When server-end returns Text/Html, it redirects user’s request to given page, achieve the most basic of MVC function.
	 * Here, if success, redirect the user request to "/contacts";if failure, redirect it to "/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);
	}

	/**
	 * modify contact information 
	 * @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);
	}

	/**
	 * show contacts list 
	 * @param page  page number 
	 * @param size  number of records per page
	 */
	@Get
	@Path("/contacts")
	@PageFlow(success = @PageInfo(value = "/template/contacts.ctl"))
	public Page<Contact> listContacts(int page, int size) {
		return this.service.listContacts(page, size);
	}

	/**
	 * show specific contact information 
	 * @param contactId 
	 */
	@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);
	}

	/**
	 * delete specific contact information 
	 * @param contactId
	 */
	@Delete
	@PageFlow(success = @PageInfo(value = "/contacts",type=ResultType.REDIRECT))
	public void deleteContact(@Parameter("contactId") String contactId) {
		this.service.deleteContact(contactId);
	}
}


//=======================================================
//business class
//=======================================================

/**
 * 
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 *
 */
@Transactional//Default value is TransactionalType.REQUIRED,it can be overrided  in method
@Interceptors({//self-defining interceptors(class-level,it works on all methods,and can be override in method)
	@Interceptor(TestInterceptor.class),
	@Interceptor(LogInterceptor.class)
})
public class ContactService{
	//inject entry management
	@Inject
	private BaseEntityManager<String, Contact> entityManager;

	public String createContact(Contact contact) {
		if (contact == null)
			throw new RuntimeException("the content of contact can not be null");

		if (this.entityManager.loadByNamedQuery("byName", contact.getName()) != null) {
			throw new RuntimeException("You have input a duplicate contact name,please enter again");
		}

		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("contact not exist!");
			this.entityManager.delete(contact);
		}
	}

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

	@Transactional(type=TransactionalType.READOLNY)//override class-level TransactionalType to READOLNY
	@Interceptor(ListContactsInterceptor.class)//override class-level Interceptor
	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("the content of contact can not be null");
		
		Contact tmpContact = this.entityManager.loadByNamedQuery("byName", contact.getName());
		if(tmpContact != null && !contact.getId().equals(tmpContact.getId()))
			throw new RuntimeException("You have input a duplicate contact name,please enter again");

		this.entityManager.update(contact);
	}
}


//=======================================================
//a case of remote call
//=======================================================

/**
 * 
 * @author <a href="mailto:zhangyouqun@gmail.com">cnoss (QQ:86895156)</a>
 *
 */
@Path( { "/testCallRemote"})
public class TestRemoteResource {
	@Inject
	@RemoteReference//inject remote resource object
	private ContactResource service;

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


you can get the JRest4Guice source code from svn(use maven)

We sincerely hope that you will give us your valuable criticisms and suggestions,contact information:









Hosted by Google Code