Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package guru.springframework.spring6resttemplate.client;

import guru.springframework.spring6resttemplate.model.BeerDTO;
import org.springframework.data.domain.Page;

import java.util.UUID;

public interface BeerClient {
Page<BeerDTO> listBeers();

Page<BeerDTO> listBeers(String beerName, String beerStyle,
Boolean showInventory, Integer pageNumber, Integer pageSize);
BeerDTO getBeerById(UUID beerId);

void deleteBeer(UUID beerId);

BeerDTO saveNewBeer(BeerDTO beer);

BeerDTO updateBeerById(BeerDTO savedBeer);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package guru.springframework.spring6resttemplate.client;

import guru.springframework.spring6resttemplate.model.BeerDTO;
import guru.springframework.spring6resttemplate.model.BeerDTOPageImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;
import java.util.UUID;

@Service
@RequiredArgsConstructor
public class BeerClientImpl implements BeerClient {
public static final String GET_BEER_PATH = "/api/v1/beer";
public static final String GET_BEER_BY_ID_PATH = "/api/v1/beer/{beerId}";

private final RestTemplateBuilder restTemplateBuilder;

@Override
public void deleteBeer(UUID beerId) {
RestTemplate restTemplate = restTemplateBuilder.build();
restTemplate.delete(GET_BEER_BY_ID_PATH, beerId);
}
@Override
public BeerDTO saveNewBeer(BeerDTO newBeer) {
RestTemplate restTemplate = restTemplateBuilder.build();
URI uri = restTemplate.postForLocation(GET_BEER_PATH, newBeer);
return restTemplate.getForObject(uri.getPath(), BeerDTO.class);
}

@Override
public BeerDTO updateBeerById(BeerDTO savedBeer) {
RestTemplate restTemplate = restTemplateBuilder.build();
restTemplate.put(GET_BEER_BY_ID_PATH, savedBeer, savedBeer.getId());
return this.getBeerById(savedBeer.getId());
}

@Override
public Page<BeerDTO> listBeers() {
return this.listBeers(null, null, null, null, null);
}
@Override
public Page<BeerDTO> listBeers(String beerName, String beerStyle,
Boolean showInventory, Integer pageNumber, Integer pageSize) {
RestTemplate restTemplate = restTemplateBuilder.build();
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromPath(GET_BEER_PATH);
//setting query params in uri path
if (beerName != null) uriBuilder.queryParam("beerName", beerName);
if (beerStyle != null) uriBuilder.queryParam("beerStyle", beerStyle);
if (showInventory != null) uriBuilder.queryParam("showInventory", showInventory);
if (pageNumber != null) uriBuilder.queryParam("pageNumber", pageNumber);
if (pageSize != null) uriBuilder.queryParam("pageSize", pageSize);

ResponseEntity<BeerDTOPageImpl> response = restTemplate.getForEntity(uriBuilder.toUriString(), BeerDTOPageImpl.class);

return response.getBody();
}

@Override
public BeerDTO getBeerById(UUID beerId) {
RestTemplate restTemplate = restTemplateBuilder.build();
//UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromPath(GET_BEER_BY_ID_PATH);
return restTemplate.getForObject(GET_BEER_BY_ID_PATH, BeerDTO.class, beerId);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package guru.springframework.spring6resttemplate.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.web.client.RestTemplateBuilderConfigurer;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.DefaultUriBuilderFactory;

@Configuration
public class RestTemplateBuilderConfig {

@Value("${rest.template.url}")
String rootUrl;
@Bean
RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
assert rootUrl != null : "Root URL must not be null.";
RestTemplateBuilder builder = configurer.configure(new RestTemplateBuilder());
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(rootUrl);

return builder.uriTemplateHandler(uriBuilderFactory);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package guru.springframework.spring6resttemplate.model;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true, value = "pageable")
public class BeerDTOPageImpl<BeerDTO> extends PageImpl<guru.springframework.spring6resttemplate.model.BeerDTO> {
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
public BeerDTOPageImpl(@JsonProperty("content") List<guru.springframework.spring6resttemplate.model.BeerDTO> content,
@JsonProperty("number") int page,
@JsonProperty("size") int size,
@JsonProperty("totalElements") long total) {
super((List<guru.springframework.spring6resttemplate.model.BeerDTO>) content, PageRequest.of(page, size), total);
}
public BeerDTOPageImpl(List<BeerDTO> content, Pageable pageable, long total) {
super((List<guru.springframework.spring6resttemplate.model.BeerDTO>) content, pageable, total);
}

public BeerDTOPageImpl(List<BeerDTO> content) {
super((List<guru.springframework.spring6resttemplate.model.BeerDTO>) content);
}
}
2 changes: 1 addition & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@

rest.template.url=http://localhost:9000
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package guru.springframework.spring6resttemplate.client;

import guru.springframework.spring6resttemplate.model.BeerDTO;
import guru.springframework.spring6resttemplate.model.BeerStyle;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.web.client.HttpClientErrorException;

import java.math.BigDecimal;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class BeerClientImplTest {
@Autowired
BeerClientImpl beerClientImpl;
@Test
void listBeersNullBeerName() {
beerClientImpl.listBeers(null, null, null, null, null);
}
@Test
void listBeers() {
beerClientImpl.listBeers("ALE", null, null, null, null);
}
@Test
void getBeerById() {
Page<BeerDTO> beerDTOS = beerClientImpl.listBeers();
BeerDTO dto = beerDTOS.getContent().get(0);
BeerDTO byId = beerClientImpl.getBeerById(dto.getId());

assertNotNull(byId);
}
@Test
void createBeerTest() {
BeerDTO beerDTO = BeerDTO.builder()
.price(new BigDecimal("12.99"))
.beerName("Test Beer")
.beerStyle(BeerStyle.ALE)
.upc("123456789012")
.build();
BeerDTO savedBeer = beerClientImpl.saveNewBeer(beerDTO);
assertNotNull(savedBeer);
}
@Test
void updateBeer() {
BeerDTO beerDTO = BeerDTO.builder()
.price(new BigDecimal("12.99"))
.beerName("Test Beer")
.beerStyle(BeerStyle.ALE)
.upc("123456789012")
.build();
BeerDTO savedBeer = beerClientImpl.saveNewBeer(beerDTO);

final String beerName = "Indian Beer";
savedBeer.setBeerName(beerName);
BeerDTO updatedBeer = beerClientImpl.updateBeerById(savedBeer);
assertEquals(beerName, updatedBeer.getBeerName());

}
@Test
void deleteBeer() {
Page<BeerDTO> beerDTOS = beerClientImpl.listBeers();
BeerDTO dto = beerDTOS.getContent().get(0);
beerClientImpl.deleteBeer(dto.getId());
assertThrows(HttpClientErrorException.class,
() -> beerClientImpl.getBeerById(dto.getId())
);

}
}