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.


Saturday, June 15, 2019

AEM OAuth Server Functionalities - Deep Dive

AEM OAuth Server Functionalities - Deep Dive

This video explains how to use Adobe Granite OAuth Server functionalities to grant the resource access to external clients





Saturday, June 8, 2019

How to Setup Job Offloading in AEM Author Instance - Asset Process Offloading?

How to Setup Job Offloading in AEM Author Instance - Asset Process Offloading?


This video explains how to Setup Job Offloading in AEM Author Instance - Asset Process Offloading





Wednesday, June 5, 2019

How to migrate the existing AEM instance to cloud storage – S3 bucket?

How to migrate the existing AEM instance to cloud storage – S3 bucket?

This video explains how to migrate the existing AEM instance to cloud storage – S3 bucket




Sunday, May 19, 2019

How to Setup the AEM Author and Publish Instances with Shared S3 Datastore?

How to Setup the AEM Author and Publish Instances with Shared S3 Datastore?

This video explains how to setup the AEM Author and Publish Instances with Shared S3 Datastore