diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml
index 1c6c6e1044..e774dc6ad9 100644
--- a/spring-rest-simple/pom.xml
+++ b/spring-rest-simple/pom.xml
@@ -31,7 +31,8 @@
org.springframework.boot
- spring-boot-test
+ spring-boot-starter-test
+ test
@@ -240,7 +241,7 @@
cargo-maven2-plugin
${cargo-maven2-plugin.version}
- true
+
tomcat8x
embedded
diff --git a/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java b/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java
index ec92ad8349..309a36609a 100644
--- a/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java
+++ b/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java
@@ -1,8 +1,5 @@
package org.baeldung.config;
-import java.text.SimpleDateFormat;
-import java.util.List;
-
import org.baeldung.config.converter.KryoHttpMessageConverter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -19,6 +16,9 @@ import org.springframework.web.servlet.config.annotation.ContentNegotiationConfi
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
/*
* Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml
*/
diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/exception/NotFoundException.java b/spring-rest-simple/src/main/java/org/baeldung/web/exception/NotFoundException.java
new file mode 100644
index 0000000000..5b4d80a659
--- /dev/null
+++ b/spring-rest-simple/src/main/java/org/baeldung/web/exception/NotFoundException.java
@@ -0,0 +1,4 @@
+package org.baeldung.web.exception;
+
+public class NotFoundException extends RuntimeException {
+}
diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/handler/RestTemplateResponseErrorHandler.java b/spring-rest-simple/src/main/java/org/baeldung/web/handler/RestTemplateResponseErrorHandler.java
new file mode 100644
index 0000000000..b1b87e89a5
--- /dev/null
+++ b/spring-rest-simple/src/main/java/org/baeldung/web/handler/RestTemplateResponseErrorHandler.java
@@ -0,0 +1,43 @@
+package org.baeldung.web.handler;
+
+import org.baeldung.web.exception.NotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.ResponseErrorHandler;
+
+import java.io.IOException;
+
+@Component
+public class RestTemplateResponseErrorHandler
+ implements ResponseErrorHandler {
+
+ @Override
+ public boolean hasError(ClientHttpResponse httpResponse)
+ throws IOException {
+
+ return (httpResponse
+ .getStatusCode()
+ .series() == HttpStatus.Series.CLIENT_ERROR || httpResponse
+ .getStatusCode()
+ .series() == HttpStatus.Series.SERVER_ERROR);
+ }
+
+ @Override
+ public void handleError(ClientHttpResponse httpResponse)
+ throws IOException {
+
+ if (httpResponse
+ .getStatusCode()
+ .series() == HttpStatus.Series.SERVER_ERROR) {
+ //Handle SERVER_ERROR
+ } else if (httpResponse
+ .getStatusCode()
+ .series() == HttpStatus.Series.CLIENT_ERROR) {
+ //Handle CLIENT_ERROR
+ if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND) {
+ throw new NotFoundException();
+ }
+ }
+ }
+}
diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/model/Bar.java b/spring-rest-simple/src/main/java/org/baeldung/web/model/Bar.java
new file mode 100644
index 0000000000..474e2070a5
--- /dev/null
+++ b/spring-rest-simple/src/main/java/org/baeldung/web/model/Bar.java
@@ -0,0 +1,22 @@
+package org.baeldung.web.model;
+
+public class Bar {
+ private String id;
+ private String name;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/service/BarConsumerService.java b/spring-rest-simple/src/main/java/org/baeldung/web/service/BarConsumerService.java
new file mode 100644
index 0000000000..4188677b4f
--- /dev/null
+++ b/spring-rest-simple/src/main/java/org/baeldung/web/service/BarConsumerService.java
@@ -0,0 +1,26 @@
+package org.baeldung.web.service;
+
+import org.baeldung.web.handler.RestTemplateResponseErrorHandler;
+import org.baeldung.web.model.Bar;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+@Service
+public class BarConsumerService {
+
+ private RestTemplate restTemplate;
+
+ @Autowired
+ public BarConsumerService(RestTemplateBuilder restTemplateBuilder) {
+ RestTemplate restTemplate = restTemplateBuilder
+ .errorHandler(new RestTemplateResponseErrorHandler())
+ .build();
+ }
+
+ public Bar fetchBarById(String barId) {
+ return restTemplate.getForObject("/bars/4242", Bar.class);
+ }
+
+}
diff --git a/spring-rest-simple/src/test/java/org/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java b/spring-rest-simple/src/test/java/org/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java
new file mode 100644
index 0000000000..2dfa81f441
--- /dev/null
+++ b/spring-rest-simple/src/test/java/org/baeldung/web/handler/RestTemplateResponseErrorHandlerIntegrationTest.java
@@ -0,0 +1,48 @@
+package org.baeldung.web.handler;
+
+import org.baeldung.web.exception.NotFoundException;
+import org.baeldung.web.model.Bar;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.client.RestClientTest;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.client.ExpectedCount;
+import org.springframework.test.web.client.MockRestServiceServer;
+import org.springframework.web.client.RestTemplate;
+
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = { NotFoundException.class, Bar.class })
+@RestClientTest
+public class RestTemplateResponseErrorHandlerIntegrationTest {
+
+ @Autowired private MockRestServiceServer server;
+ @Autowired private RestTemplateBuilder builder;
+
+ @Test(expected = NotFoundException.class)
+ public void givenRemoteApiCall_when404Error_thenThrowNotFound() {
+ Assert.assertNotNull(this.builder);
+ Assert.assertNotNull(this.server);
+
+ RestTemplate restTemplate = this.builder
+ .errorHandler(new RestTemplateResponseErrorHandler())
+ .build();
+
+ this.server
+ .expect(ExpectedCount.once(), requestTo("/bars/4242"))
+ .andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.NOT_FOUND));
+
+ Bar response = restTemplate.getForObject("/bars/4242", Bar.class);
+ this.server.verify();
+ }
+}
\ No newline at end of file