
As we are already aware that JBossAS 7.1 is a Fully EE6 certified Application Server. It provides implementations of most needed features like “RestEasy WebService” And “CDI” injection. You might have already seen/read some of the demos of RestEast webservices in our previous articles. But here in this article we are going to focus on following points .
Point-1). How to developand use the JAX-RS resteasy implementations and various annotations associated with it on JBoss AS7.1.1.Final.
Point-2). How to use the CDI Injection of @javax.inject.Named Beans using @javax.enterprise.context.ApplicationScoped inside our RestEasy WebServices. And will see that why do we need “beans.xml” file.
Point-3). How and why to use the annotations like @javax.xml.bind.annotation.XmlRootElement.
Point-4). How to write a Pure RestEasy Standalone Client to access the RestEasy WebService.
The Source Code of this Demo can be Downloaded from the following link: “Github”
https://github.com/jaysensharma/MiddlewareMagicDemos/tree/master/RestfulService_With_CDI_AS7
Writing RestEasy WebService with CDI Injection.
Step-1). Create a directory somewhere in your file system like “home/userone/RestfulService_With_CDI_AS7″ then in this directory create a “src” directory where we will place all our source codes and application components.
Step-2). Write a Simple Class “Customer.java” inside “home/userone/RestfulService_With_CDI_AS7/src” with the help of “@javax.xml.bind.annotation.XmlRootElement” annotation sothat its value can be represented as XML element in an XML document.
package test;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
private int id;
private String name;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
Step-3). As above write another Simple Class “Customers.java” inside “home/userone/RestfulService_With_CDI_AS7/src” with the help of “@javax.xml.bind.annotation.XmlRootElement” annotation sothat its value also can be represented as XML element in an XML document.
package test;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.*;
@XmlRootElement
public class Customers {
private List customer;
public List getCustomer() {
return customer;
}
public void setCustomer(List customer) {
this.customer = customer;
}
}
Step-4). Now we will write “TestBean.java” inorder to populate it’s property “java.util.TreeMap” with the Customer Objects. Write the “TestBean.java” program inside “home/userone/RestfulService_With_CDI_AS7/src”
package beans;
import java.io.Serializable;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import java.util.TreeMap;
import test.Customer;
@Named
@ApplicationScoped
public class TestBean implements Serializable
{
private static final long serialVersionUID = 1L;
private TreeMap customerMap;
public TestBean()
{
System.out.println("\n\t TestBean which is CDI Bean instantiated.");
customerMap=new TreeMap();
}
public TreeMap getCustomerMap()
{
System.out.println("\n\t[TestBean] getCustomerMap() called.");
return customerMap;
}
public void setCustomerMap(TreeMap customerMap)
{
System.out.println("\n\t[TestBean] setCustomerMap(TreeMap) called.");
this.customerMap = customerMap;
}
}
Step-5). As in the above TestBean we have used the @Named annotation and we have declared it’s scope as “ApplicationScoped” so now we will create a “beans.xml” file which is finally going to be placed inside “WEB-INF” directory of our webapplication for the CDI to wrok. So here we will need to create a file with name “beans.xml” inside “home/userone/RestfulService_With_CDI_AS7/src” as following:
*** NOTE: An application that uses CDI must have a file named beans.xml. The file can be completely empty (it has content only in certain limited situations), but it must be present.
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans>
Step-6). In order to develop RestEasy WebService we should provide a class which extends “javax.ws.rs.core.Application” so write a Program “MyRestService.java” inside “home/userone/RestfulService_With_CDI_AS7/src” as following:
package ws.test;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("test")
public class MyRestService extends Application {
}
Step-7). Now the Most important Step Here we will write a Class “CustomersResource.java” with the help of “javax.ws.rs.*” packages in order to process the Client Requests. so write a Program “CustomersResource.java” inside “home/userone/RestfulService_With_CDI_AS7/src” as following:
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.FormParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.servlet.ServletContext;
import javax.ws.rs.core.Context;
import javax.inject.Inject;
@Produces("application/xml")
@Path("customers")
public class CustomersResource {
@Inject
private beans.TestBean testBean;
private TreeMap customerMap = new TreeMap();
public CustomersResource() {
System.out.println("[CustomerResource] Instantiated "+this);
Customer customer1 = new Customer();
customer1.setId(1111);
customer1.setName("CustomerOne");
customer1.setAddress("Bombay, India");
Customer customer2 = new Customer();
customer2.setId(2222);
customer2.setName("CustomerTwo");
customer2.setAddress("Pune, India");
Customer customer3 = new Customer();
customer3.setId(3333);
customer3.setName("CustomerThree");
customer3.setAddress("Bangalore, India");
customerMap.put(customer1.getId(),customer1);
customerMap.put(customer2.getId(),customer2);
customerMap.put(customer3.getId(),customer3);
if(testBean!=null)
{
System.out.println("[CustomersResource] testBean NOT NULL "+testBean);
testBean.setCustomerMap(customerMap);
}
else
{
System.out.println("[CustomersResource] testBean IS NULL");
}
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("all")
public Customers getCustomers() {
List customers = new ArrayList();
customers.addAll(testBean.getCustomerMap().values());
Customers allCustomers=new Customers();
allCustomers.setCustomer(customers);
return allCustomers;
}
@GET
@Path("{id}")
public Customer getCustomer(@PathParam("id") int customerId) {
return customerMap.get(customerId);
}
public String addDefaultCustomer(Customer customer) {
customerMap.put(customer.getId(), customer);
return "Customer ID: " + customer.getId() +" Name: "+ customer.getName()+" Address: "+customer.getAddress();
}
@POST
@Path("add")
@Produces(MediaType.APPLICATION_XML)
@Consumes("application/x-www-form-urlencoded")
public Customer addCustomer(@FormParam("custId")int id,@FormParam("custName")String name,@FormParam("custAddress")String address) {
Customer customer = new Customer();
customer.setId(id);
customer.setName(name);
customer.setAddress(address);
customerMap.put(customer.getId(),customer);
testBean.setCustomerMap(customerMap);
return customer;
}
}
Step-8). Now we will write following kind of JSP file “index.jsp” inside “home/userone/RestfulService_With_CDI_AS7/src” in order to allow users to provide/enter the customer details.
CDI Demo
<table border="10%">
<form action="test/customers/add" method="POST"></form>
<tbody>
<tr>
<td>Customer ID:</td>
<td> <input name="custId" type="text" /></td>
</tr>
<tr>
<td>Customer Name:</td>
<td> <input name="custName" type="text" /></td>
</tr>
<tr>
<td>Customer Address:</td>
<td> <input name="custAddress" type="text" /></td>
</tr>
<tr>
<td><input type="submit" value="Add Customer" /></td>
<td><input type="reset" value="Reset" /></td>
</tr>
</tbody>
</table>
Step-9). Now write the following kind of “web.xml” file inside “home/userone/RestfulService_With_CDI_AS7/src” directord make sure that you are using the web.xml 3.0 version XSD (web-app_3_0.xsd) declaration in your web.xml file as following
javax.ws.rs.core.Application
javax.ws.rs.core.Application
javax.ws.rs.core.Application
/*
Step-10). Now we will write the ANT “build.xml” file inside “home/userone/RestfulService_With_CDI_AS7″ directory in order to build and deploy and test our WebService .
<!-- Need to place at lease one empty "beans.xml" file inside WEB-INF -->
Step-11). Now before running your ANT script to build and deploy the above webapplication you should have the ANT as well as JAVA set in the $PATH variable of the Shell / command prompt as following:
. For Unix Based OS: export PATH=/home/userone/jdk1.6.0_21/bin:/home/userone/org.apache.ant_1.6.5/bin:$PATH For Windows Based OS: set PATH=C:/jdk1.6.0_21/bin;C:/org.apache.ant_1.6.5/bin;%PATH% .
Step-12). Now once the PATH is set In the command/Shell prompt you can move inside the directory “home/userone/RestfulService_With_CDI_AS7″ and then run the ant to build/deploy the webservice. by running the command “ant”
[userone@localhost RestfulService_With_CDI_AS7]$ ant
Buildfile: build.xml
init:
[delete] Deleting directory /userone/RestfulService_With_CDI_AS7/build
[mkdir] Created dir: /userone/RestfulService_With_CDI_AS7/build
[mkdir] Created dir: /userone/RestfulService_With_CDI_AS7/tmp
build:
[mkdir] Created dir: /userone/RestfulService_With_CDI_AS7/tmp/WEB-INF/classes
[javac] Compiling 5 source files to /userone/RestfulService_With_CDI_AS7/tmp/WEB-INF/classes
[copy] Copying 1 file to /userone/RestfulService_With_CDI_AS7/tmp
[copy] Copying 1 file to /userone/RestfulService_With_CDI_AS7/tmp
[copy] Copying 1 file to /userone/RestfulService_With_CDI_AS7/tmp/WEB-INF/classes
[copy] Copying 1 file to /userone/RestfulService_With_CDI_AS7/tmp/WEB-INF/classes
[copy] Copying 1 file to /userone/RestfulService_With_CDI_AS7/tmp/WEB-INF
[jar] Building jar: /userone/RestfulService_With_CDI_AS7/tmp/RestServiceWithCDI.war
[copy] Copying 1 file to /userone/RestfulService_With_CDI_AS7/build
deploy:
[echo] ******************* Deploying the WAR file RestServiceWithCDI.war *********************
[echo] ********** build/RestServiceWithCDI.war to /home/userone/jboss-as-7.1.1.Final/standalone/deployments **********
[copy] Copying 1 file to /home/userone/jboss-as-7.1.1.Final/standalone/deployments
[echo] ******************* Deployed Successfully *********************
BUILD SUCCESSFUL
Total time: 2 seconds
Testing The RestEasy WebService from WebBrowser
Step-13). Once the WebService is deployed successfully you can access it using the following URL: “http://localhost:8080/RestServiceWithCDI//index.jsp” As following:
If you want to access all the Customers Details then access te following URL “http://localhost:8080/RestServiceWithCDI/test/customers/all” :
Writing and Testing a Pure RestEasy WebService Client
Step-13). Now we are going to use our own Standalone RestEasy WebService Client in order to access the WebService. So write program with name “RestEasyClient.java” inside “home/userone/RestfulService_With_CDI_AS7/src” directory as following:
package client;
import java.io.*;
import javax.ws.rs.core.MediaType;
import org.jboss.resteasy.client.ClientRequest;
import org.jboss.resteasy.client.ClientResponse;
public class RestEasyClient
{
public static void main(String ar[]) throws Exception
{
String url="http://localhost:8080/RestServiceWithCDI/test/customers/all";
MediaType mediaType=MediaType.APPLICATION_XML_TYPE;
String result = "";
try
{
ClientRequest request = new ClientRequest(url);
request.accept(mediaType);
ClientResponse response = request.get(String.class);
if (response.getStatus() != 200)
{
System.out.println("***** BAD RESPONSE *****");
throw new RuntimeException("Request Processing Failed with HTTP status: "+ response.getStatus());
}
BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(response.getEntity().getBytes())));
String output = null;
while ((output = br.readLine()) != null)
{
result = result+output+"\n";
}
result=result.replaceAll("><",">\n<");
System.out.println("\n\n********** RESULT **********\n"+result);
}
catch (Exception e)
{
System.err.println("\n\t Exception Occured: "+e);
e.printStackTrace();
}
}
}
Step-14). Now run the command “ant client” in order compile and run the Client program from the following directory “home/userone/RestfulService_With_CDI_AS7″ as following:
[userone@localhost RestfulService_With_CDI_AS7]$ ant client
Buildfile: build.xml
client:
[echo] ******************* Client Accessing RestEasy Service *********************
[javac] Compiling 6 source files to /NotBackedUp/Downloads/RestfulService_With_CDI_AS7/build
[java] log4j:WARN No appenders could be found for logger (org.jboss.resteasy.plugins.providers.DocumentProvider).
[java] log4j:WARN Please initialize the log4j system properly.
[java] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[java]
[java]
[java] ********** RESULT **********
[java] <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
[java] <customers>
[java] <customer>
[java] <address>Bombay, India</address>
[java] <id>1111</id>
[java] <name>CustomerOne</name>
[java] </customer>
[java] <customer>
[java] <address>Pune, India</address>
[java] <id>2222</id>
[java] <name>CustomerTwo</name>
[java] </customer>
[java] <customer>
[java] <address>Bangalore, India</address>
[java] <id>3333</id>
[java] <name>CustomerThree</name>
[java] </customer>
[java] <customer>
[java] <address>Pune, India</address>
[java] <id>8888</id>
[java] <name>MiddlewareMagic</name>
[java] </customer>
[java] </customers>
[java]
BUILD SUCCESSFUL
Total time: 3 seconds
.
.
Thanks ![]()
Middleware Magic Team



