diff --git a/Spring-Boot/spring-boot-rest-template/.gitignore b/Spring-Boot/spring-boot-rest-template/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.jar b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..c1dd12f Binary files /dev/null and b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.jar differ diff --git a/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.properties b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..b7cb93e --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/Spring-Boot/spring-boot-rest-template/pom.xml b/Spring-Boot/spring-boot-rest-template/pom.xml new file mode 100644 index 0000000..b6194ba --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.3 + + + com.javadevjournal + spring-boot-rest-template + 0.0.1-SNAPSHOT + spring-boot-rest-template + spring-boot-rest-template + + 1.8 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.apache.httpcomponents + httpclient + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplication.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplication.java new file mode 100644 index 0000000..9d88070 --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplication.java @@ -0,0 +1,52 @@ +package com.javadevjournal.springbootresttemplate; + +import org.apache.http.client.config.RequestConfig; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +public class SpringBootRestTemplateApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootRestTemplateApplication.class, args); + } + + @Bean + RestTemplate restTemplate() { + return new RestTemplate(); + } + + @Bean("restTemplateWithTimeout") + RestTemplate restTemplateWithTimeout() { + return new RestTemplate(getClientHttpRequestFactory()); + } + + ClientHttpRequestFactory getClientHttpRequestFactory() { + int timeout = 5000; + HttpComponentsClientHttpRequestFactory clientHttpRequestFactory + = new HttpComponentsClientHttpRequestFactory(); + clientHttpRequestFactory.setConnectTimeout(timeout); + return clientHttpRequestFactory; + } + + ClientHttpRequestFactory getClientHttpRequestFactoryV1() { + int timeout = 5000; + RequestConfig config = RequestConfig.custom() + .setConnectTimeout(timeout) + .setConnectionRequestTimeout(timeout) + .setSocketTimeout(timeout) + .build(); + CloseableHttpClient client = HttpClientBuilder + .create() + .setDefaultRequestConfig(config) + .build(); + return new HttpComponentsClientHttpRequestFactory(client); + } + +} \ No newline at end of file diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/EmployeeController.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/EmployeeController.java new file mode 100644 index 0000000..6943a4d --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/EmployeeController.java @@ -0,0 +1,49 @@ +package com.javadevjournal.springbootresttemplate.controller; + +import com.javadevjournal.springbootresttemplate.model.Employee; +import com.javadevjournal.springbootresttemplate.service.EmployeeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +public class EmployeeController { + + @Autowired + EmployeeService employeeService; + + @GetMapping("/employees") + private List getAllEmployees() { + return employeeService.getAllEmployees(); + } + + @GetMapping("/employees/{id}") + private Employee getEmployeeById(@PathVariable("id") int id) { + return employeeService.getEmployeeById(id); + } + + @PostMapping("/employees") + private Employee createEmployee(@RequestBody Employee employee) { + employeeService.saveOrUpdate(employee); + return employee; + } + + @PutMapping("/employees/{id}") + private Employee updateEmployee(@PathVariable("id") int id, @RequestBody Employee employee) { + Employee updatedEmployee = employeeService.getEmployeeById(id); + updatedEmployee.setName(employee.getName()); + updatedEmployee.setSalary(employee.getSalary()); + employeeService.saveOrUpdate(updatedEmployee); + return updatedEmployee; + } + + @DeleteMapping("/employees/{id}") + private Employee deleteById(@PathVariable("id") int id) { + Employee employeeDeleted = employeeService.getEmployeeById(id); + employeeService.delete(id); + return employeeDeleted; + } +} diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/RestTemplateController.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/RestTemplateController.java new file mode 100644 index 0000000..f88c425 --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/controller/RestTemplateController.java @@ -0,0 +1,108 @@ +package com.javadevjournal.springbootresttemplate.controller; + +import com.javadevjournal.springbootresttemplate.model.Employee; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import java.util.*; + +@RestController +public class RestTemplateController { + private final String URI_EMPLOYEE = "http://localhost:8081/employees/"; + private final String URI_EMPLOYEE_ID = "http://localhost:8081/employees/{id}"; + + @Autowired + RestTemplate restTemplate; + + @GetMapping("/v1/allEmployees") + public ResponseEntity getAllV1() { + Employee[] EmployeesArray = restTemplate.getForObject(URI_EMPLOYEE, Employee[].class); + return new ResponseEntity<>(Arrays.asList(EmployeesArray), HttpStatus.OK); + } + + @GetMapping("/v1/employees/{id}") + public ResponseEntity getByIdV1(@PathVariable final Integer id) { + Map params = new HashMap<>(); + params.put("id", String.valueOf(id)); + Employee Employee = restTemplate.getForObject(URI_EMPLOYEE_ID, Employee.class, params); + return new ResponseEntity<>(Employee, HttpStatus.OK); + } + + @GetMapping("/v2/allEmployees") + public ResponseEntity getAllV2() { + ResponseEntity responseEntity = restTemplate.getForEntity(URI_EMPLOYEE, Employee[].class); + return responseEntity; + } + + @GetMapping("/v2/employees/{id}") + public ResponseEntity getByIdV2(@PathVariable final Integer id) { + Map params = new HashMap<>(); + params.put("id", String.valueOf(id)); + ResponseEntity responseEntity + = restTemplate.getForEntity(URI_EMPLOYEE_ID, Employee.class, params); + return responseEntity; + } + + @GetMapping("/v3/allEmployees") + public ResponseEntity getAllV3() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + HttpEntity entity = new HttpEntity<>(httpHeaders); + return restTemplate.exchange(URI_EMPLOYEE, HttpMethod.GET, entity, Employee[].class); + } + + @GetMapping("/v3/employees/{id}") + public ResponseEntity getByIdV3(@PathVariable final Integer id) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + HttpEntity entity = new HttpEntity<>(httpHeaders); + return restTemplate.exchange(URI_EMPLOYEE + id, HttpMethod.GET, entity, Employee.class); + } + + @PostMapping("/v1/employees") + public ResponseEntity createV1(@RequestBody final Employee newEmployee) { + Employee createdEmployee = restTemplate.postForObject(URI_EMPLOYEE, newEmployee, Employee.class); + return new ResponseEntity(createdEmployee, HttpStatus.CREATED); + } + + @PostMapping("/v2/employees") + public ResponseEntity createV2(@RequestBody final Employee newEmployee) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + HttpEntity entity = new HttpEntity<>(newEmployee, httpHeaders); + return restTemplate.exchange(URI_EMPLOYEE, HttpMethod.POST, entity, Employee.class); + } + + @PutMapping("/v1/employees/{id}") + public ResponseEntity updateEmployeeV1(@PathVariable final Integer id, @RequestBody Employee newEmployee) { + Map params = new HashMap<>(); + params.put("id", String.valueOf(id)); + restTemplate.put(URI_EMPLOYEE_ID, newEmployee, params); + return new ResponseEntity("Employee Updated with id " + id, HttpStatus.OK); + } + + @PutMapping("/v2/employees/{id}") + public ResponseEntity updateEmployeeV2(@PathVariable final Integer id, @RequestBody Employee newEmployee) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + HttpEntity entity = new HttpEntity<>(newEmployee, httpHeaders); + return restTemplate.exchange(URI_EMPLOYEE + id, HttpMethod.PUT, entity, Employee.class); + } + + @DeleteMapping("/v1/employees/{id}") + public ResponseEntity deleteV1(@PathVariable final Integer id) { + Map params = new HashMap<>(); + params.put("id", String.valueOf(id)); + restTemplate.delete(URI_EMPLOYEE_ID, params); + return new ResponseEntity<>("Employee deleted with id " + id, HttpStatus.OK); + } + + @DeleteMapping("/v2/employees/{id}") + public ResponseEntity deleteV2(@PathVariable final Integer id) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + HttpEntity entity = new HttpEntity<>(httpHeaders); + return restTemplate.exchange(URI_EMPLOYEE + id, HttpMethod.DELETE, entity, Employee.class); + } +} diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/model/Employee.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/model/Employee.java new file mode 100644 index 0000000..a59d3a3 --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/model/Employee.java @@ -0,0 +1,36 @@ +package com.javadevjournal.springbootresttemplate.model; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +@Table(name = "EMPLOYEE") +public class Employee implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Integer id; + String name; + Double salary; + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getSalary() { + return salary; + } + + public void setSalary(Double salary) { + this.salary = salary; + } +} + diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/repository/EmployeeRepository.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/repository/EmployeeRepository.java new file mode 100644 index 0000000..4f7c0ff --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/repository/EmployeeRepository.java @@ -0,0 +1,9 @@ +package com.javadevjournal.springbootresttemplate.repository; + +import com.javadevjournal.springbootresttemplate.model.Employee; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface EmployeeRepository extends JpaRepository { +} diff --git a/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/service/EmployeeService.java b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/service/EmployeeService.java new file mode 100644 index 0000000..c37da13 --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/main/java/com/javadevjournal/springbootresttemplate/service/EmployeeService.java @@ -0,0 +1,34 @@ +package com.javadevjournal.springbootresttemplate.service; + +import com.javadevjournal.springbootresttemplate.model.Employee; +import com.javadevjournal.springbootresttemplate.repository.EmployeeRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class EmployeeService { + + @Autowired + EmployeeRepository employeeRepository; + + public List getAllEmployees() { + List employees = new ArrayList(); + employeeRepository.findAll().forEach(employee -> employees.add(employee)); + return employees; + } + + public Employee getEmployeeById(int id) { + return employeeRepository.findById(id).get(); + } + + public void saveOrUpdate(Employee employee) { + employeeRepository.save(employee); + } + + public void delete(int id) { + employeeRepository.deleteById(id); + } +} diff --git a/Spring-Boot/spring-boot-rest-template/src/main/resources/application.properties b/Spring-Boot/spring-boot-rest-template/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/Spring-Boot/spring-boot-rest-template/src/test/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplicationTests.java b/Spring-Boot/spring-boot-rest-template/src/test/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplicationTests.java new file mode 100644 index 0000000..53d35a6 --- /dev/null +++ b/Spring-Boot/spring-boot-rest-template/src/test/java/com/javadevjournal/springbootresttemplate/SpringBootRestTemplateApplicationTests.java @@ -0,0 +1,13 @@ +package com.javadevjournal.springbootresttemplate; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringBootRestTemplateApplicationTests { + + @Test + void contextLoads() { + } + +}