Skip to main content

REST API using Play! Framework in JSON and XML Format

Play Framework 

Play is heavily inspired by Ruby on Rails. Play supports both Scala and Java and enables developers to develop application faster by following convention over configurations.

The following post describes how we can expose REST API Endpoints very quickly supporting multiple format like JSON XML etc using Java with Play Framework.

Rest End Point Example 

Say We want the List of Users to be exposed as a JSON Response with an endpoint.
We will achieve the same with the following steps.
  • Step 1: Define the Routes and Controller Mapping
  • Step 2: Define Entity(Model Object)
  • Step 3: Define the Controller
  • Step 4: Start the Play Application


Step1: Define the  routes (/conf/routes)


Open the /conf/routes file and add the following line(s). 

GET /api/v1/User/details/all   controllers.MyApplicationApiV1.getUserList()
GET /api/v1/User/details/{userId}   controllers.MyApplicationApiV1.getUserDetails(userId: Long)


These entries in the routes file says that map
route /api/v1/User/details/all to controller method MyApplicationApiV1.getUserList
and
/api/v1/User/details/{userId} to controller method getUserDetails(userId: Long)


Step2: Define the Model Object



@Entity
@Table(name="test_users")
public class User extends Model{
 
 private String userName;
 
 private String userEmail;
 
 private Boolean notification;
 
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName;
 }
 
 public String getUserEmail() {
  return userEmail;
 }
 public void setUserEmail(String userEmail) {
  this.userEmail = userEmail;
 }
 public Boolean getNotification() {
  return notification;
 }
 public void setNotification(Boolean notification) {
  this.notification = notification;
 }
 
 @Override
 public String toString() {
  return getUserEmail() + " - " + getUserName();
 }
 
}

This is a User Model Object annotated with JPA Annotations like Entity, Table. Note that This Entity Class Extends the play.db.jpa.Model Class. With Proper Database configurations we should be able to Persist this Entity in Database. The Controller Class will be able to retrieve these Entities and work with them.

Step3: Define the Controller

Now the Controller Section. In Play framework it is easy to expose any rest endpoints, we have to just implement the method(class) as per the routes definition.

This Controller has two methods  getUserList() and getUserDetails(userID) .
As per the routes definitions, Play will map the first endpoint
/api/v1/User/details/all to the method getUserList(). This controller method is loading all the  all the Users Objects and using the renderJSON method to render the response in JSON Format.   Second Method in the Controller getUserDetails(Long userId) maps to URI /api/v1/User/details/{userId} This method is loading only a specific User and Sending the response in JSON format.

Rendering the Response in XML Format.

If we want to render the response in XML Format we can use renderXml(s) rather then renderJSON(s) in the controller methods. Following is the example for rendering the response in XML format for the /api/v1/User/details/all End Point.


Step4: Start the Play Application

Once the Play Application is Started if we access the endpoints then it should render the response in JSON Format.


Note:

Note that Details like configuring Database, and configuring CRUD is not covered here. It is assumed that we already have working Database configured with Play App.

Comments

Popular posts from this blog

Converting Java Map to String

Java Collections framework, String manipulation etc is something that we often encounter in Development process.
For processing collections (like checking null/empty, Intersection, Disjunction) We do have some of the very use full libraries.

Some of the Collection related libraries are Apche Commons Collections and Google  Collections(Guava).

Problem Use Case

This article explains how to convert a Java Map to String(and vice versa) using different libraries and technique.

One way is to use StringBuilder(Or String) and loop though the Map and build the String by applying some sort of separator ( for key:value and entry). Here we have to take care of the null value etc.

Without Any Library
If we want to convert the map to a String with key value separator and also individual entry seperator in the resulting String, we have to write code for that. For a simple Map, we have to iterate though the map, take care of the null values etc. Following is a sample to get String built out from Map C…

Masking Credit Card number in Java

Sometimes we need to mask crucial information like Credit Card Numbers, CVV numbers etc before storing  or logging the information. This example mask Credit Card Number (Except last 4 Digit) from a Text which contains information along with Credit Card Number.

The following example demonstrates how we can easily mask the credit card with Matcher and Pattern Classes. This Sample Code uses Matcher and Pattern.
Pattern Used in this sample is not optimized for Credit Card Numbers, this pattern will get any numerical numbers in the String Content.  Based on the Credit Card Type a more efficient and Strict RegEx can be used to mask the Credit Card.
/**Mask the Credit card number but last four digit value **/   Pattern PATTERN = Pattern.compile("[0-9]+"); String message = content; Matcher matcher = PATTERN.matcher(message); String maskingChar = "*"; StringBuilder finalMask = new StringBuilder(maskingChar); while …

Invoking EJB deployed on a remote machine

Invoking EJB deployed on a remote machineIn case we are calling remote ejb( ejb deployed on remote machines),The JNDI lookup might lookup like,Properties env = new Properties();env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");env.put(Context.PROVIDER_URL, "XX.XXX.XX.XX:1099");env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); Context ctx = new InitialContext(env);If we are calling local ejb then we can simply create InitialContext without any parameters.Like,Context ctx = new InitialContext();