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
- Create a Dynamic Web Project RESTful_Example and create a package for our src files “com.javainterviewpoint“
- 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 - Create the Java classes ProducesExample.java and Student.java under com.javainterviewpoint folder.
- 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 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://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
JSON Response
http://localhost:8080/RESTful_Example/rest/produce/json
Leave a Reply