Wednesday, 7 August 2019

Spring boot REST: @PathVariable: Map path parameters to method arguments


@PathVariableannotation is used to bind segments of paths to method parameters. Suppose you want to get details of specific employee, usually the url look like following.

/employees/1: Gives you the details of employee with id 1.
/employees/2: Gives you the details of employee with id 2.

Example
@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());
}

In the above snippet. path variable "id" is mapped to employeeId.

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.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)
  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>

  </dependencies>
</project>


Total project structure looks like below.

Run App.java.

Open the url ‘http://localhost:8080/api/v1/employees/1’ in browser to get employee 1 details.

{
  "last_name": "Dayanand",
  "first_name": "Sunil"
}

You can download complete working application from this link.




Previous                                                    Next                                                    Home

No comments:

Post a Comment