Saturday, April 18, 2020

Spring REST Controller Example

Learn to create Spring REST controller which can handle REST API calls in any Spring MVC application. It invloves adding @Controller and @RequestMapping annotations.
For writing this application, I am modifying the source code written in Spring MVC example. So, if want, you can download the source code from given link.

1. Update maven dependencies

Update pom.xml to add support of JAXB and Jackson (for xml and json formats).
<dependency>
  <groupid>org.codehaus.jackson</groupid>
  <artifactid>jackson-mapper-asl</artifactid>
  <version>${jackson-mapper-asl.version}</version>
  <scope>runtime</scope>
</dependency>
 
<dependency>
  <groupid>javax.xml.bind</groupid>
  <artifactid>jaxb-api</artifactid>
  <version>${jaxb-api.version}</version>
  <scope>runtime</scope>
</dependency>

2. Add ContentNegotiatingViewResolver

Update bean configuration file for view resolvers and add ContentNegotiatingViewResolver.
<mvc:annotation-driven />
 
<context:component-scan  base-package="com.howtodoinjava.web" />
 
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
      <map>
          <entry key="html" value="text/html"></entry>
          <entry key="json" value="application/json"></entry>
          <entry key="xml"  value="application/xml"></entry>
      </map>
    </property>
     <property name="viewResolvers">
        <list>
          <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <property name="suffix" value=".jsp"></property>
          </bean>
        </list>
    </property>
</bean>

3. Add JAXB annotations in model classes

I am writing 2 classes i.e. Users.java and User.java. These classes will be having JAXB annotations, which will be used by marshaller to convert them in appropriate xml or json formats.
They are for example only and you can write your own classes.
Users.java
package com.howtodoinjava.model;
 
import java.util.Collection;
 
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement(name="users")
@XmlAccessorType(XmlAccessType.NONE)
public class Users
{
    @XmlElement(name="user")
    private Collection<User> users;
 
    public Collection<User> getUsers() {
        return users;
    }
 
    public void setUsers(Collection<User> users) {
        this.users = users;
    }
}
User.java
package com.howtodoinjava.model;
 
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement(name="user")
@XmlAccessorType(XmlAccessType.NONE)
public class User {
 
    @XmlElement(name="first-name")
    private String firstName;
 
    @XmlElement(name="last-name")
    private String lastName;
 
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

4. Create REST Controller

The DemoController.java has REST specific annotations for path mappings in request parameters mappings. Also, we will specify the header attributes for request and response.
DemoController.java
@Controller
@RequestMapping("/users")
public class DemoController
{
    @RequestMapping(method = RequestMethod.GET, value="/{id}", headers="Accept=*/*")
    public @ResponseBody User getUserById(@PathVariable String id)
    {
        User user = new User();
        user.setFirstName("john");
        user.setLastName("adward");
        return user;
    }
 
    @RequestMapping(method = RequestMethod.GET,  headers="Accept=*/*")
    public @ResponseBody Users getAllUsers()
    {
        User user1 = new User();
        user1.setFirstName("john");
        user1.setLastName("adward");
 
        User user2 = new User();
        user2.setFirstName("tom");
        user2.setLastName("hanks");
 
        Users users = new Users();
        users.setUsers(new ArrayList<User>());
        users.getUsers().add(user1);
        users.getUsers().add(user2);
 
        return users;
    }
}

5. Demo for spring rest example

Now lets re-deploy the application on tomcat and hit the URL on any REST client. I am using RESTClient. This is a firefox plugin for testing the RESTful webservices.
  • URL : http://localhost:8080/firstSpringApplication/users
    http://localhost:8080/firstSpringApplication/users
  • URL : http://localhost:8080/firstSpringApplication/users/123
    http://localhost:8080/firstSpringApplication/users/123

No comments:

Post a Comment

How to DROP SEQUENCE in Oracle?

  Oracle  DROP SEQUENCE   overview The  DROP SEQUENCE  the statement allows you to remove a sequence from the database. Here is the basic sy...