Wednesday, 7 August 2019

Spring boot: Restrict Rest API to produce specific type of data


By default Spring REST APIs generate json response. But client can request the format that it is intrested for.

For example client can ask for XML response by setting the Accept header to application/xml.

In some cases you want to restrict the response data to specific format, for example, you want to send only xml response.

You can restrict to specific media type using produces attribute of RequestMapping annotation.
@RequestMapping(value = "employees", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<List<Employee>> all() {
  return ResponseEntity.ok(empRepo.all());
}

Find the below working application.
App.java
package com.sample.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
  public static void main(String[] args) {

    SpringApplication.run(App.class, args);

  }
}


EmployeeController.java
package com.sample.app.cotroller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.sample.app.model.Employee;
import com.sample.app.repository.EmployeeRepository;

@RestController
@RequestMapping("api/v1/")
public class EmployeeController {

  @Autowired
  private EmployeeRepository empRepo;

  @RequestMapping(value = "employees", method = RequestMethod.GET, produces = {MediaType.APPLICATION_XML_VALUE})
  public ResponseEntity<List<Employee>> all() {
    return ResponseEntity.ok(empRepo.all());
  }

  @RequestMapping(value = "employees", method = RequestMethod.POST)
  public ResponseEntity<Employee> create(@RequestBody Employee emp) {
    Employee persistedEmp = empRepo.add(emp);

    return ResponseEntity.status(HttpStatus.CREATED).body(persistedEmp);

  }

  @RequestMapping(value = "employees/{id}", method = RequestMethod.GET)
  public ResponseEntity<Employee> byId(@PathVariable("id") int employeeId) {

    for (Employee emp : empRepo.all()) {
      if (emp.getId() == employeeId) {
        return ResponseEntity.ok(emp);
      }
    }
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new Employee());
  }
}


HomeController.java
package com.sample.app.cotroller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

  @RequestMapping("/")
  public String home() {
    return "Hello World";
  }
}


Employee.java
package com.sample.app.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties({"employee_id"})
@JsonPropertyOrder({"last_name", "first_name"})
public class Employee {
  

  @JsonProperty("employee_id")
  private int id;

  @JsonProperty("first_name")
  private String firstName;

  @JsonProperty("last_name")
  private String lastName;
  
  public Employee() {}

  public Employee(int id, String firstName, String lastName) {
    super();
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  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;
  }

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("Employee [id=").append(id).append(", firstName=").append(firstName).append(", lastName=")
        .append(lastName).append("]");
    return builder.toString();
  }

}


EmployeeRepository.java
package com.sample.app.repository;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.sample.app.model.Employee;

@Repository
public class EmployeeRepository {

  private static final List<Employee> emps = new ArrayList<> ();
  
  private static int counter = 4;
  
  static {
    Employee emp1 = new Employee(1, "Sunil", "Dayanand");
    Employee emp2 = new Employee(2, null, "Shetty");
    Employee emp3 = new Employee(3, "Ram", "Anand");
    Employee emp4 = new Employee(4, "Akansha", null);
    
    emps.add(emp1);
    emps.add(emp2);
    emps.add(emp3);
    emps.add(emp4);
    
  }
  
  public List<Employee> all(){
    return emps;
  }
  
  public Employee add(Employee emp) {
    emp.setId(counter);
    counter++;
    
    emps.add(emp);
    return emp;
  }
  
}


pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>springRest</groupId>
  <artifactId>springRest</artifactId>
  <version>1</version>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
  </parent>

  <name>springbootApp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

  </dependencies>
</project>


Total project structure looks like below.

Run App.java.


Open the url 'http://localhost:8080/api/v1/employees' in browser, you will get xml response like below.

If you request for json response from the server, you will receive 406 response code.


You can download complete working application from this link.



Previous                                                    Next                                                    Home

No comments:

Post a Comment