Friday, June 21, 2019

How to expose Restful Services through JAX-RS(Jersey) in AEM

How to expose Restful Services through JAX-RS(Jersey) in AEM


JAX-RS is a specification that provides portable API’s for developing, exposing and accessing web applications designed and implemented in compliance with principals of REST architectural style.

-RS has annotations to bind specific URI patterns and HTTP methods to individual methods of your Java code. AEM is driven based on REST principals but there is no direct support for creating Restful services.

There are multiple implementations for JAX-RS specifications, this tutorial explains exposing REST based services in AEM through Jersey.

Install JAX-RS Jersey modules


As a first step, install the JAX-RS Jersey connector to AEM server

The connector modules can be downloaded from the following URL — https://search.maven.org/search?q=g:com.eclipsesource.jaxrs, the required modules are jersey-all, publisher and provider-gson


jax-rs-OSGI-modules

Install the modules through OSGI console —


Ensure the bundles are active

AEM-OSGI-console-bundle-installation
AEM-OSGI-console-bundle-installation

JAX-RS Component


Create a component with JAX-RS annotations.

package jaxrsservice.core.restservices;

import javax.ws.rs.Path;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.io.IOException; 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

import org.osgi.service.component.annotations.Component; 

@Component(service=RESTProductAPI.class)
@Path("/products")
public class RESTProductAPI {

@GET
@Path("/{catagroy}/{title}/p/{code : \\d{5}}")
@Produces({MediaType.TEXT_PLAIN})
public String getProductDetails(@Context HttpServletRequest request, @Context HttpServletResponse response,@PathParam("catagroy") String catagroy,@PathParam("title") String title,@PathParam("code") String code) {

return "code="+code+";catagroy="+catagroy+";title="+title; 

}

@POST
@Path("/create")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Product createProduct(Product product) {
product.setResult("Product Created");
product.setId("1");
return product;

}
}

Some of the important annotation used to define the component

@POST/@GET — HTTP Method supported by the method, the other HTTP methods can be used based on the requirement
 
@Path — URL path, static or dynamic regex based URL’s can be defined
 
@Produces — The output produced by the method e.g MediaType.APPLICATION_JSON and MediaType.TEXT_PLAIN etc
 
@Consumes — The input consumed by the method e.g MediaType.APPLICATION_JSON and MediaType.APPLICATION_FORM_URLENCODED etc

POJO class to map JSON input/Output

package jaxrsservice.core.restservices;

public class Product {

private String id;
private String name;
private String title;
private String category;
private String desc;
private String result;

public void setId(String id)
{
this.id=id;
}
public void setName(String name)
{
this.name=name;
}
public void setTitle(String title)
{
this.title=title;
}
public void setCategory(String category)
{
this.category=category;
}
public void setDesc(String desc)
{
this.desc=desc;
}

public void setResult(String result)
{
this.result=result;
}

public String getId()
{
return id;
}
public String getName()
{
return name;
}
public String getTitle()
{
return title;
}
public String getCategory()
{
return category;
}
public String getDesc()
{
return desc;
}

public String getResult()
{
return result;
}

}

Maven dependency to support JAX-RS annotations

<dependency>
 <groupId>javax.ws.rs</groupId>
 <artifactId>javax.ws.rs-api</artifactId>
 <version>2.0</version>
 </dependency>

Sample Code Repository


Deploy the component as a core module(execute mvn clean install -PautoInstallBundle from the core folder) and ensure the module is active

Now the service is ready to accept the requests and ready for testing


This will provide the following response - code=12345;catagroy=catagroyTest;title=sampleTitle

createProduct — http://localhost:4502/services/products/create (POST)

Tested through Postman

Sample Input:

{
“name”:”testName”,
“title”:”titleTest”,
“catagory”:”catagoryTest”,
“desc”:”descTest”
}

Sample Output:

{
“id”: “1”,
“name”: “testName”,
“title”: “titleTest”,
“desc”: “descTest”,
“result”: “Product Created”
}


postman-testing-post-service




By using JAX-RS(Jersey) OSGI modules the REST API’s can be exposed in AEM, JAX-RS provides more flexibility to define the REST services — handling different input/output types, mapping of inputs/outputs to/from POJO’s. Allows to define more dynamic URL paths to the REST services. AEM built on REST principles so by default supports the REST based services but JAX-RS can be used based on the use cases.

3 comments:

  1. Hello, can you post the project as well please.

    ReplyDelete
  2. https://github.com/techforum-repo/youttubedata/tree/master/jaxrsservice

    ReplyDelete
  3. Where does the URL part /services come from?

    ReplyDelete