Previously we have learnt about how to produce different types of responses using @Produces annotation, In this article we will learn how to consume different types of request from the user using @Consumes annotation.
@Consumes annotation is used to specify the MIME media types that a resource can consume. @Consumes 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 @Consumes 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 ConsumesExample.java and Student.java under com.javainterviewpoint folder.
- Place the web.xml under the WEB-INF directory
@Produces Example
We have two methods here consumeXMLRequest() which consumes XML request (MediaType.APPLICATION_XML) and consumeJSONRequest() which consumes json request (MediaType.APPLICATION_JSON) based on the MediaType passed in the in @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("consume") public class ConsumesExample { @Path("xml") @POST @Consumes(MediaType.APPLICATION_XML) public void consumeXMLRequest(Student s) { System.out.println("**Received XML request**"); System.out.println(" Name : "+s.getName()); System.out.println(" Age : "+s.getAge()); } @Path("json") @POST @Consumes(MediaType.APPLICATION_JSON) public void consumeJSONRequest(Student s) { System.out.println("**Received JSON request**"); System.out.println(" Name : "+s.getName()); System.out.println(" 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 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 :
Use any REST clients for this, i am using “POSTMAN” client here.
Passing XML Request
http://localhost:8080/RESTful_Example/rest/consume/xml
**Received XML request** Name : JavaInterviewPoint Age : 10
Passing JSON Request
http://localhost:8080/RESTful_Example/rest/consume/json**Received JSON request** Name : JavaInterviewPoint Age : 11
Leave a Reply