X

Executing Put operation of REST service programatically from ADF App

Arunkumar Ramamoorthy
Consulting Technical Manager

In quite some cases, we would like to call the PUT method on a REST
service by constructing the parameters during runtime and pass it on. In
this article, we would go through how to deal with such cases when
building an ADF Application.

Refer this tutorial
for introduction to REST service in where, GET and DELETE methods are
explained. In this sample, we'll see how to implement PUT operation
using a HashMap. In fact, as like in the above tutorial, we can directly
execute the PUT method as well. This article is mainly concentrated on
how to construct the parameters dynamically at runtime.

First let us create a simple POJO to hold employee records.

package project1;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Emp {
public Emp() {
super();
}
private String name;
private int id;
private int exp;
private int salary;
public Emp(String name, int id, int exp, int salary) {
super();
this.name = name;
this.id = id;
this.exp = exp;
this.salary = salary;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setExp(int exp) {
this.exp = exp;
}
public int getExp() {
return exp;
}
public void setSalary(int salary) {
this.salary = salary;
}
public int getSalary() {
return salary;
}
public String toString() {
String empXml = "<name>"+getName()+"</name>"+"\n"+
"<id>"+getId()+"</id>"+"\n"+
"<experience>"+getExp()+"</experience>"+"\n"+
"<salary>"+getSalary()+"</salary>";
return empXml;
}
}
Then, create a REST service using the for the Employee.

package project1;
import javax.ws.rs.Path;
import java.util.*;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
@Path("/test")
public class Service {
static ArrayList<Emp> emp = new ArrayList<Emp>();
public Service() {
super();
}
@GET
@Produces("application/xml")
public ArrayList<Emp> getEmps() {
return emp;
}
@DELETE
public void deleteEmp(@QueryParam("id") int id) {
emp.remove(getObj(id));
}
@PUT
@Consumes("application/xml")
public void addEmp( Emp e) {
emp.add(e);
}
@PUT
@Path("defaultEmp")
public Response addEmp() {
emp.add(new Emp("abc",1,5,10000));
emp.add(new Emp("xyz",2,7,15000));
emp.add(new Emp("lmn",3,5,8000));
return Response.ok().build();
}
@POST
public void upadteEmp(@QueryParam("id")int id,Emp e) {
deleteEmp(id);
addEmp(e);
}
public Emp getObj(int id) {
Iterator i = emp.iterator();
while(i.hasNext()){
Emp emp = (Emp)i.next();
if((emp.getId())==id)
{
System.out.println(emp.getName());
return emp;
}
}
return null;
}
}
We'll come to the UI part now.

After
creating a Fusion Web Application from JDeveloper, create a new URL
Data Control for the REST service created above (for GET and PUT
Operations).

DataControls.dcx looks like below

DataControls.jpg



Now,
our aim is to have a UI, from where we can enter the employee details.
Once after having the data, construct parameter object and execute
loadData (PUT) method.

This is done by having 4 input texts and
bind them to attributes in the backing bean. Drag and Drop the loadData
method from RestPut DataControl (and do not specify a value for the
parameter).



And the code snippet of the jspx page

<af:panelFormLayout id="pfl1">
<f:facet name="footer">
<af:commandButton text="Put"
disabled="#{!bindings.loadData.enabled}" id="cb1"
actionListener="#{pageFlowScope.RestBean.performPut}"/>
</f:facet>
<af:inputText label="Id" id="it1"
value="#{pageFlowScope.RestBean.id}" autoSubmit="true"/>
<af:inputText label="Name" id="it2"
autoSubmit="true" value="#{pageFlowScope.RestBean.name}"/>
<af:inputText label="Exp" id="it3"
value="#{pageFlowScope.RestBean.exp}" autoSubmit="true"/>
<af:inputText label="Sal" id="it4"
autoSubmit="true" value="#{pageFlowScope.RestBean.sal}"/>
</af:panelFormLayout>

In the backing bean (RestBean), we have 4 attributes with accessors that are mapped to the Text Items.

    private Number id,sal,exp;
private String name;
public void setId(Number id) {
this.id = id;
}
public Number getId() {
return id;
}
public void setSal(Number sal) {
this.sal = sal;
}
public Number getSal() {
return sal;
}
public void setExp(Number exp) {
this.exp = exp;
}
public Number getExp() {
return exp;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}

Now, we'll add an actionListener code in the backing bean, in that,
we can construct a Map with the required values and then execute the
method by passing Map to it.

    public void performPut(ActionEvent actionEvent) {
BindingContainer bindings = getBindings();
Map putParamMap = new HashMap();
putParamMap.put("id", getId());
putParamMap.put("name", getName());
putParamMap.put("exp", getExp());
putParamMap.put("sal", getSal());
OperationBinding operationBinding = bindings.getOperationBinding("loadData");
operationBinding.getParamsMap().put("emp",putParamMap);
Object result = operationBinding.execute();
if (!operationBinding.getErrors().isEmpty()) {
System.out.println("Error processing put operation..");
}
}
public BindingContainer getBindings() {
return BindingContext.getCurrent().getCurrentBindingsEntry();
}
In
the above code, we find the loadData method from the DataBindings
entry, create a Map with all the required attributes to create an
Employee record, get the Parameter list for the method and pass the Map
to method as parameter to execute it.


Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.