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("nt TestBean which is CDI Bean instantiated."); customerMap=new TreeMap(); } public TreeMap getCustomerMap() { System.out.println("nt[TestBean] getCustomerMap() called."); return customerMap; } public void setCustomerMap(TreeMap customerMap) { System.out.println("nt[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("nn********** RESULT **********n"+result); } catch (Exception e) { System.err.println("nt 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 log4j:WARN No appenders could be found for logger (org.jboss.resteasy.plugins.providers.DocumentProvider). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. ********** RESULT ********** <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <customers> <customer> <address>Bombay, India</address> <id>1111</id> <name>CustomerOne</name> </customer> <customer> <address>Pune, India</address> <id>2222</id> <name>CustomerTwo</name> </customer> <customer> <address>Bangalore, India</address> <id>3333</id> <name>CustomerThree</name> </customer> <customer> <address>Pune, India</address> <id>8888</id> <name>MiddlewareMagic</name> </customer> </customers> BUILD SUCCESSFUL Total time: 3 seconds
.
.
Thanks 🙂
Middleware Magic Team