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
Install the modules through OSGI console —
Ensure the bundles are active
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;
}
}
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
@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;
}
}
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>
<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
getProductDetails — http://localhost:4502/services/products/catagroyTest/sampleTitle/p/12345(GET)
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”
}
Hello, can you post the project as well please.
ReplyDeletehttps://github.com/techforum-repo/youttubedata/tree/master/jaxrsservice
ReplyDeleteWhere does the URL part /services come from?
ReplyDelete