[BAEL-6318] code for consuming Page<Entity> using rest template
This commit is contained in:
parent
1db057ebc8
commit
b61c2af4ac
|
@ -0,0 +1,36 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.PageImpl;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
public class CustomPageImpl<T> extends PageImpl<T> {
|
||||||
|
|
||||||
|
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
|
||||||
|
public CustomPageImpl(@JsonProperty("content") List<T> content, @JsonProperty("number") int number, @JsonProperty("size") int size, @JsonProperty("totalElements") Long totalElements, @JsonProperty("pageable") JsonNode pageable,
|
||||||
|
@JsonProperty("last") boolean last, @JsonProperty("totalPages") int totalPages, @JsonProperty("sort") JsonNode sort, @JsonProperty("numberOfElements") int numberOfElements) {
|
||||||
|
super(content, PageRequest.of(number, 1), 10);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomPageImpl(List<T> content, Pageable pageable, long total) {
|
||||||
|
super(content, pageable, total);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomPageImpl(List<T> content) {
|
||||||
|
super(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomPageImpl() {
|
||||||
|
super(new ArrayList<>());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import org.springframework.core.ParameterizedTypeReference;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class EmployeeClient {
|
||||||
|
private final RestTemplate restTemplate;
|
||||||
|
|
||||||
|
public EmployeeClient(RestTemplate restTemplate) {
|
||||||
|
this.restTemplate = restTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Page<EmployeeDto> getEmployeeDataFromExternalAPI(Pageable pageable) {
|
||||||
|
String url = "http://localhost:8080/external-service/employee";
|
||||||
|
|
||||||
|
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(url)
|
||||||
|
.queryParam("page", pageable.getPageNumber())
|
||||||
|
.queryParam("size", pageable.getPageSize());
|
||||||
|
|
||||||
|
ResponseEntity<CustomPageImpl<EmployeeDto>> responseEntity = restTemplate.exchange(uriBuilder.toUriString(), HttpMethod.GET, null, new ParameterizedTypeReference<CustomPageImpl<EmployeeDto>>() {
|
||||||
|
});
|
||||||
|
|
||||||
|
return responseEntity.getBody();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.PageImpl;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/organisation")
|
||||||
|
public class EmployeeController {
|
||||||
|
|
||||||
|
private final EmployeeService organisationService;
|
||||||
|
|
||||||
|
public EmployeeController(EmployeeService organisationService) {
|
||||||
|
this.organisationService = organisationService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/employee")
|
||||||
|
public ResponseEntity<Page<EmployeeDto>> getEmployeeData(Pageable pageable) {
|
||||||
|
Page<EmployeeDto> employeeData = organisationService.getEmployeeData(pageable);
|
||||||
|
return ResponseEntity.ok(employeeData);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/data")
|
||||||
|
public ResponseEntity<Page<EmployeeDto>> getData(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size) {
|
||||||
|
List<EmployeeDto> empList = listImplementation();
|
||||||
|
|
||||||
|
int totalSize = empList.size();
|
||||||
|
int startIndex = page * size;
|
||||||
|
int endIndex = Math.min(startIndex + size, totalSize);
|
||||||
|
|
||||||
|
List<EmployeeDto> pageContent = empList.subList(startIndex, endIndex);
|
||||||
|
|
||||||
|
Page<EmployeeDto> employeeDtos = new PageImpl<>(pageContent, PageRequest.of(page, size), totalSize);
|
||||||
|
|
||||||
|
return ResponseEntity.ok()
|
||||||
|
.body(employeeDtos);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<EmployeeDto> listImplementation() {
|
||||||
|
List<EmployeeDto> empList = new ArrayList<>();
|
||||||
|
empList.add(new EmployeeDto("Jane", "Finance", 50000));
|
||||||
|
empList.add(new EmployeeDto("Sarah", "IT", 70000));
|
||||||
|
empList.add(new EmployeeDto("John", "IT", 90000));
|
||||||
|
return empList;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
public class EmployeeDto {
|
||||||
|
@JsonProperty("name")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@JsonProperty("dept")
|
||||||
|
private String dept;
|
||||||
|
|
||||||
|
@JsonProperty("salary")
|
||||||
|
private long salary;
|
||||||
|
|
||||||
|
public EmployeeDto() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmployeeDto(String name, String dept, long salary) {
|
||||||
|
this.name = name;
|
||||||
|
this.dept = dept;
|
||||||
|
this.salary = salary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDept() {
|
||||||
|
return dept;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDept(String dept) {
|
||||||
|
this.dept = dept;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getSalary() {
|
||||||
|
return salary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSalary(long salary) {
|
||||||
|
this.salary = salary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class EmployeeService {
|
||||||
|
private final EmployeeClient employeeClient;
|
||||||
|
|
||||||
|
public EmployeeService(EmployeeClient employeeClient) {
|
||||||
|
this.employeeClient = employeeClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Page<EmployeeDto> getEmployeeData(Pageable pageable) {
|
||||||
|
return employeeClient.getEmployeeDataFromExternalAPI(pageable);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class PageEntityResponseApp {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(PageEntityResponseApp.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class RestTemplateConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public RestTemplate restTemplate() {
|
||||||
|
return new RestTemplate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.mockito.Mockito.eq;
|
||||||
|
import static org.mockito.Mockito.isNull;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.springframework.core.ParameterizedTypeReference;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
public class EmployeeClientUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenRestTemplate_whenGetEmployeeDataFromExternalAPI_thenGetPageDataWithContents() {
|
||||||
|
CustomPageImpl<EmployeeDto> mockedResponse = new CustomPageImpl<>(Arrays.asList(
|
||||||
|
new EmployeeDto("Jane", "Finance", 50000),
|
||||||
|
new EmployeeDto("Sarah", "IT", 70000),
|
||||||
|
new EmployeeDto("John", "IT", 90000)
|
||||||
|
));
|
||||||
|
|
||||||
|
RestTemplate restTemplate = mock(RestTemplate.class);
|
||||||
|
ResponseEntity<CustomPageImpl<EmployeeDto>> responseEntity = new ResponseEntity<>(mockedResponse,
|
||||||
|
HttpStatus.OK);
|
||||||
|
|
||||||
|
String url = "http://localhost:8080/employee";
|
||||||
|
int pageNumber = 0;
|
||||||
|
int pageSize = 10;
|
||||||
|
String expectedUrl = url + "?page=" + pageNumber + "&size=" + pageSize;
|
||||||
|
|
||||||
|
HttpMethod expectedMethod = HttpMethod.GET;
|
||||||
|
ParameterizedTypeReference<CustomPageImpl<EmployeeDto>> responseType = new ParameterizedTypeReference<CustomPageImpl<EmployeeDto>>() {
|
||||||
|
};
|
||||||
|
|
||||||
|
Mockito.when(restTemplate.exchange(
|
||||||
|
expectedUrl,
|
||||||
|
expectedMethod,
|
||||||
|
null,
|
||||||
|
responseType
|
||||||
|
)).thenReturn(responseEntity);
|
||||||
|
|
||||||
|
EmployeeClient employeeClient = new EmployeeClient(restTemplate);
|
||||||
|
|
||||||
|
Page<EmployeeDto> result = employeeClient.getEmployeeDataFromExternalAPI(
|
||||||
|
PageRequest.of(pageNumber, pageSize)
|
||||||
|
);
|
||||||
|
|
||||||
|
verify(restTemplate).exchange(
|
||||||
|
eq(expectedUrl),
|
||||||
|
eq(expectedMethod),
|
||||||
|
isNull(),
|
||||||
|
eq(responseType)
|
||||||
|
);
|
||||||
|
assertEquals(1, result.getNumberOfElements());
|
||||||
|
assertEquals(mockedResponse, result.getContent().get(0));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
package com.baeldung.pageentityresponse;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||||
|
import org.springframework.boot.web.server.LocalServerPort;
|
||||||
|
import org.springframework.core.ParameterizedTypeReference;
|
||||||
|
import org.springframework.data.domain.PageImpl;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
@SpringBootTest(classes = PageEntityResponseApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||||
|
@AutoConfigureMockMvc
|
||||||
|
public class EmployeeControllerIntegrationTest {
|
||||||
|
|
||||||
|
@LocalServerPort
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TestRestTemplate restTemplate;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenGetData_whenRestTemplateExchange_thenReturnsPageOfEmployee() {
|
||||||
|
ResponseEntity<CustomPageImpl<EmployeeDto>> responseEntity = restTemplate.exchange(
|
||||||
|
"http://localhost:" + port + "/organisation/data",
|
||||||
|
HttpMethod.GET,
|
||||||
|
null,
|
||||||
|
new ParameterizedTypeReference<CustomPageImpl<EmployeeDto>>() {}
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(200, responseEntity.getStatusCodeValue());
|
||||||
|
PageImpl<EmployeeDto> restPage = responseEntity.getBody();
|
||||||
|
assertNotNull(restPage);
|
||||||
|
|
||||||
|
assertEquals(10, restPage.getTotalElements());
|
||||||
|
|
||||||
|
List<EmployeeDto> content = restPage.getContent();
|
||||||
|
assertNotNull(content);
|
||||||
|
assertEquals(3, content.size());
|
||||||
|
|
||||||
|
EmployeeDto employee1 = content.get(0);
|
||||||
|
assertEquals("Jane", employee1.getName());
|
||||||
|
assertEquals("Finance", employee1.getDept());
|
||||||
|
assertEquals(50000, employee1.getSalary());
|
||||||
|
|
||||||
|
EmployeeDto employee2 = content.get(1);
|
||||||
|
assertEquals("Sarah", employee2.getName());
|
||||||
|
assertEquals("IT", employee2.getDept());
|
||||||
|
assertEquals(70000, employee2.getSalary());
|
||||||
|
|
||||||
|
EmployeeDto employee3 = content.get(2);
|
||||||
|
assertEquals("John", employee3.getName());
|
||||||
|
assertEquals("IT", employee3.getDept());
|
||||||
|
assertEquals(90000, employee3.getSalary());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue