JAX-RS REST @Consumes both XML and JSON Example

Previously we have learnt how to use @Produces annotation, Consuming JSON or Consuming XML separately. We have consumed either xml or json request but not both xml and json in a single method. In this example we will learn how to consume multiple media type which the client is giving as input, lets see how we can achieve it.

Folder Structure

  1. Create a Dynamic Web Project RESTful_Example and create a package for our src files com.javainterviewpoint
  2. Place the required jar files under WEB-INF/Lib 

    jersey-bundle-1.18.jar
    jsr311-api-1.1.1.jar
    jaxb-api.jar
    jaxb-impl-2.0.1.jar
    asm-3.1.jar

  3. Create the Java classes ConsumesBothExample.java and Student.java under  com.javainterviewpoint folder.
  4. Place the web.xml  under the WEB-INF directory

Produces_XML_JSON_Example.java

The getBothRequest() method is capable of consuming both xml and json request, as we have added both media types to @Consumes annotation

package com.javainterviewpoint;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

@Path("consumesboth")
public class ConsumesBothExample 
{
    @Path("both")
    @POST
    @Consumes({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
    public void getBothRequest(Student s)
    {
        System.out.println("****Student Details*****");
        System.out.println("Student Name : "+s.getName());
        System.out.println("Student Age  : "+s.getAge());
    }
}

Student.java

We have annotated our Student class with @XmlRootElement marking the root element.

package com.javainterviewpoint;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Student 
{
    private String name;
    private int age;
       
    public Student() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee%20http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee%20http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp_ID" version="2.4">
 <display-name>Restful Web Application</display-name>
 <servlet>
 <servlet-name>jersey-serlvet</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.javainterviewpoint</param-value>
 </init-param>
 
 <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>jersey-serlvet</servlet-name>
 <url-pattern>/rest/*</url-pattern>
 </servlet-mapping>
</web-app>

We register our jersey container “com.sun.jersey.spi.container.servlet.ServletContainer” in the servlet-class of our web.xml and we will mention the source files location as the value to the init param “com.sun.jersey.config.property.packages” so that the container will scan for annotations of the class files within that package.

Output :

XML Request

http://localhost:8080/RESTful_Example/rest/consumesboth/both

In the postman client under "Body" tab select "raw" format and select "xml" in dropdown
Consumes_XML1
****Student Details*****
Student Name : JavaInterviewPoint99
Student Age  : 99

JSON Request

http://localhost:8080/RESTful_Example/rest/consumesboth/both
In the postman client under "Body" tab select "raw" format and select "json" in dropdown
Consumes_JSON1****Student Details*****
Student Name : JavaInterviewPoint
Student Age : 11

Leave a Reply

Your email address will not be published. Required fields are marked *