JAX-RS REST @Produces Example

Previously we have learnt about how to get parameters using @PathParam, @QueryParam, @Context, @FormParam@MatrixParam annotations, In this article we will learn how to send different types of response back to the user using @Produces annotation.

@Produces annotation is used to specify the MIME media types that a resource can produce and send back to the client. @Produces can be applied at both class level and method level, If applied on class level all the methods can produce the specified MIME types by default. If it is applied at the method level, it overrides any @Produces annotations applied at the class level.

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 ProducesExample.java and Student.java under  com.javainterviewpoint folder.
  4. Place the web.xml  under the WEB-INF directory

@Produces Example

We have two methods here getXMLResponse() which produces XML response(MediaType.APPLICATION_XML) and getJSONResponse() produces json response (MediaType.APPLICATION_JSON) based on the MediaType passed in the in @Produces annotation

package com.javainterviewpoint;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("produce")
public class ProducesExample    
{
    @Path("xml")
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Student getXMLResponse()
    {
        Student s = new Student();
        s.setAge(10);
        s.setName("JavaInterviewPoint");
        
        return s;
    }
    @Path("json")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Student getJSONResponse()
    {
        Student s = new Student();
        s.setAge(11);
        s.setName("JavaInterviewPoint");
        
        return s;
    }
}

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 Response
http://localhost:8080/RESTful_Example/rest/produce/xml

Produces_XML

JSON Response

http://localhost:8080/RESTful_Example/rest/produce/json

Produces_JSON


Leave a Reply

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