Tuesday, May 29, 2012

JAX-RS With Jersey Example

JAX-RS is an  api that supports REST style of web services.  Following's are some of the implementation of the JAX-RS api
1) Jersey
2) RestEasy
3) Apache CXF

Following example demonstrate a simple Calculator Web service  and it's client using Jersey.

I have used the following tools and libraries
1) Eclipse 3.7 with WTP
2) Tomcat 6
3) Jersey

Full source code with more examples are available on Google Code at Sidd JAX-RS Code.

To start with  created a Java Web project and created some packages in that.
The package com.sidd.aschema contains all XSD, wsdl  etc files.  We also have a shchema file named SiddSimpleCalculator.xsd in the same package.
The project structure in eclipse looks like





Use the xjc command to generate the service classes from the  XSD as follows.

$  xjc -p com.sidd.rs.gent -d ../../../ -xmlschema SiddCalculatorSimple.xsd
where  com.sidd.rs is the package name and -d (directory) is the relative location where the classes should be generated.

The xjc coomand generates  the follwoing files.
com\sidd\rs\gent\MathRequest.java
com\sidd\rs\gent\MathResponse.java
com\sidd\rs\gent\MetaDataInfo.java
com\sidd\rs\gent\ObjectFactory.java
com\sidd\rs\gent\package-info.java

Service Class
Now write the service class.

@Path("/calculate")
public class CalculatorRSImpl implements CalculatorService {
 String operator;
 Integer numA;
 Integer numB;
@GET
 @Path("{opt}/{numa}/{numb}")
 @Produces("application/json") //"application/json"
 public MathOperationRS addTwoNumbers(@PathParam("opt") String opt,
@PathParam("numa") String numa, @PathParam("numb") String numb) {
  Integer result = doCalculateCoreLogic(opt,numa,numb);
  MathOperationRQ rq = new MathOperationRQ();
  MathOperationRS rs = new MathOperationRS();
  rq.setOperandA(new BigInteger(numa));
  rq.setOperandB(new BigInteger(numb));
  rq.setOperationTypeNew("Add");
  rs.setMathOperationRQ(rq);
  rs.setResult(result);
  return rs;
 }
}

The above class defines a webservice whose with path matched to "/calculate" at class level and also path "({opt}/{numa}/{numb}) at method level. So the Context path to invoke this method would be something like http://localhost:8080/MyJRS2/rest/calculate/add/10/20/


web.xml entry
The following declaration in web.xml will make the jersey to be deployed and make all root resources or provider classes in package com.sidd.rs

[servlet]
    [servlet-name]Jersey REST Service[/servlet-name]
    [servlet-class]com.sun.jersey.spi.container.servlet.ServletContainer[/servlet-class]
    [init-param]
      [param-name]com.sun.jersey.config.property.packages[/param-name]
      [param-value]com.sidd.rs[/param-value]
    [/init-param]
    [load-on-startup]1[/load-on-startup]
  [/servlet]


Library Put the required lib's under the web-inf/lib folder. Start Application Deploy the application into your tomcat and start the tomcat installation. You should be able to access the application using the following URL http://{SERVERNAME:PORTNUM}/MyJRS2/rest/calculate/add/10/20/ Result: Upon successful deployement we should be getting json response as follows

{"MathOperationRQ":{"OperationTypeNew":"Add","OperandA":"10","OperandB":"20"},"Result":"30.0"}

No comments :

Post a Comment