diff --git a/spring-web/src/test/java/org/springframework/web/client/AsyncRestTemplateIntegrationTests.java b/spring-web/src/test/java/org/springframework/web/client/AsyncRestTemplateIntegrationTests.java index 14c288d76fa..86b436ba588 100644 --- a/spring-web/src/test/java/org/springframework/web/client/AsyncRestTemplateIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/AsyncRestTemplateIntegrationTests.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.Charset; -import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.Set; @@ -29,6 +28,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import org.junit.Assert; import org.junit.Test; import org.springframework.core.io.ClassPathResource; @@ -65,14 +65,14 @@ import static org.junit.Assert.fail; */ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCase { - private final AsyncRestTemplate template = new AsyncRestTemplate(new HttpComponentsAsyncClientHttpRequestFactory()); + private final AsyncRestTemplate template = new AsyncRestTemplate( + new HttpComponentsAsyncClientHttpRequestFactory()); @Test public void getEntity() throws Exception { - Future> futureEntity = - template.getForEntity(baseUrl + "/{method}", String.class, "get"); - ResponseEntity entity = futureEntity.get(); + Future> future = template.getForEntity(baseUrl + "/{method}", String.class, "get"); + ResponseEntity entity = future.get(); assertEquals("Invalid content", helloWorld, entity.getBody()); assertFalse("No headers", entity.getHeaders().isEmpty()); assertEquals("Invalid content-type", textContentType, entity.getHeaders().getContentType()); @@ -81,10 +81,9 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa @Test public void multipleFutureGets() throws Exception { - Future> futureEntity = - template.getForEntity(baseUrl + "/{method}", String.class, "get"); - futureEntity.get(); - futureEntity.get(); + Future> future = template.getForEntity(baseUrl + "/{method}", String.class, "get"); + future.get(); + future.get(); } @Test @@ -104,9 +103,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - // wait till done - while (!futureEntity.isDone()) { - } + waitTillDone(futureEntity); } @Test @@ -119,9 +116,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa assertEquals("Invalid content-type", textContentType, entity.getHeaders().getContentType()); assertEquals("Invalid status code", HttpStatus.OK, entity.getStatusCode()); }, ex -> fail(ex.getMessage())); - // wait till done - while (!futureEntity.isDone()) { - } + waitTillDone(futureEntity); } @Test @@ -176,8 +171,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!headersFuture.isDone()) { - } + waitTillDone(headersFuture); } @Test @@ -185,15 +179,14 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa ListenableFuture headersFuture = template.headForHeaders(baseUrl + "/get"); headersFuture.addCallback(result -> assertTrue("No Content-Type header", result.containsKey("Content-Type")), ex -> fail(ex.getMessage())); - while (!headersFuture.isDone()) { - } + waitTillDone(headersFuture); } @Test public void postForLocation() throws Exception { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.setContentType(new MediaType("text", "plain", Charset.forName("ISO-8859-15"))); - HttpEntity entity = new HttpEntity(helloWorld, entityHeaders); + HttpEntity entity = new HttpEntity<>(helloWorld, entityHeaders); Future locationFuture = template.postForLocation(baseUrl + "/{method}", entity, "post"); URI location = locationFuture.get(); assertEquals("Invalid location", new URI(baseUrl + "/post/1"), location); @@ -203,7 +196,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa public void postForLocationCallback() throws Exception { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.setContentType(new MediaType("text", "plain", Charset.forName("ISO-8859-15"))); - HttpEntity entity = new HttpEntity(helloWorld, entityHeaders); + HttpEntity entity = new HttpEntity<>(helloWorld, entityHeaders); final URI expected = new URI(baseUrl + "/post/1"); ListenableFuture locationFuture = template.postForLocation(baseUrl + "/{method}", entity, "post"); locationFuture.addCallback(new ListenableFutureCallback() { @@ -216,21 +209,19 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!locationFuture.isDone()) { - } + waitTillDone(locationFuture); } @Test public void postForLocationCallbackWithLambdas() throws Exception { HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.setContentType(new MediaType("text", "plain", Charset.forName("ISO-8859-15"))); - HttpEntity entity = new HttpEntity(helloWorld, entityHeaders); + HttpEntity entity = new HttpEntity<>(helloWorld, entityHeaders); final URI expected = new URI(baseUrl + "/post/1"); ListenableFuture locationFuture = template.postForLocation(baseUrl + "/{method}", entity, "post"); locationFuture.addCallback(result -> assertEquals("Invalid location", expected, result), ex -> fail(ex.getMessage())); - while (!locationFuture.isDone()) { - } + waitTillDone(locationFuture); } @Test @@ -257,8 +248,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!responseEntityFuture.isDone()) { - } + waitTillDone(responseEntityFuture); } @Test @@ -266,10 +256,10 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa HttpEntity requestEntity = new HttpEntity<>(helloWorld); ListenableFuture> responseEntityFuture = template.postForEntity(baseUrl + "/{method}", requestEntity, String.class, "post"); - responseEntityFuture.addCallback(result -> assertEquals("Invalid content", helloWorld, result.getBody()), + responseEntityFuture.addCallback( + result -> assertEquals("Invalid content", helloWorld, result.getBody()), ex -> fail(ex.getMessage())); - while (!responseEntityFuture.isDone()) { - } + waitTillDone(responseEntityFuture); } @Test @@ -293,8 +283,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!responseEntityFuture.isDone()) { - } + waitTillDone(responseEntityFuture); } @Test @@ -316,16 +305,14 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!deletedFuture.isDone()) { - } + waitTillDone(deletedFuture); } @Test public void deleteCallbackWithLambdas() throws Exception { ListenableFuture deletedFuture = template.delete(new URI(baseUrl + "/delete")); - deletedFuture.addCallback(result -> assertNull(result), ex -> fail(ex.getMessage())); - while (!deletedFuture.isDone()) { - } + deletedFuture.addCallback(Assert::assertNull, ex -> fail(ex.getMessage())); + waitTillDone(deletedFuture); } @Test @@ -393,8 +380,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa assertNotNull(ex.getResponseBodyAsString()); } }); - while (!future.isDone()) { - } + waitTillDone(future); } @Test @@ -407,8 +393,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa assertNotNull(hcex.getStatusText()); assertNotNull(hcex.getResponseBodyAsString()); }); - while (!future.isDone()) { - } + waitTillDone(future); } @Test @@ -445,8 +430,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa assertNotNull(hsex.getResponseBodyAsString()); } }); - while (!future.isDone()) { - } + waitTillDone(future); } @Test @@ -459,8 +443,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa assertNotNull(hsex.getStatusText()); assertNotNull(hsex.getResponseBodyAsString()); }); - while (!future.isDone()) { - } + waitTillDone(future); } @Test @@ -485,8 +468,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!allowedFuture.isDone()) { - } + waitTillDone(allowedFuture); } @Test @@ -495,8 +477,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa allowedFuture.addCallback(result -> assertEquals("Invalid response", EnumSet.of(HttpMethod.GET, HttpMethod.OPTIONS, HttpMethod.HEAD,HttpMethod.TRACE), result), ex -> fail(ex.getMessage())); - while (!allowedFuture.isDone()) { - } + waitTillDone(allowedFuture); } @Test @@ -529,8 +510,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!responseFuture.isDone()) { - } + waitTillDone(responseFuture); } @Test @@ -543,8 +523,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa template.exchange(baseUrl + "/{method}", HttpMethod.GET, requestEntity, String.class, "get"); responseFuture.addCallback(result -> assertEquals("Invalid content", helloWorld, result.getBody()), ex -> fail(ex.getMessage())); - while (!responseFuture.isDone()) { - } + waitTillDone(responseFuture); } @Test @@ -552,7 +531,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.set("MyHeader", "MyValue"); requestHeaders.setContentType(MediaType.TEXT_PLAIN); - HttpEntity requestEntity = new HttpEntity(helloWorld, requestHeaders); + HttpEntity requestEntity = new HttpEntity<>(helloWorld, requestHeaders); Future> resultFuture = template.exchange(baseUrl + "/{method}", HttpMethod.POST, requestEntity, Void.class, "post"); ResponseEntity result = resultFuture.get(); @@ -566,7 +545,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.set("MyHeader", "MyValue"); requestHeaders.setContentType(MediaType.TEXT_PLAIN); - HttpEntity requestEntity = new HttpEntity(helloWorld, requestHeaders); + HttpEntity requestEntity = new HttpEntity<>(helloWorld, requestHeaders); ListenableFuture> resultFuture = template.exchange(baseUrl + "/{method}", HttpMethod.POST, requestEntity, Void.class, "post"); final URI expected =new URI(baseUrl + "/post/1"); @@ -581,8 +560,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa fail(ex.getMessage()); } }); - while (!resultFuture.isDone()) { - } + waitTillDone(resultFuture); } @Test @@ -590,7 +568,7 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.set("MyHeader", "MyValue"); requestHeaders.setContentType(MediaType.TEXT_PLAIN); - HttpEntity requestEntity = new HttpEntity(helloWorld, requestHeaders); + HttpEntity requestEntity = new HttpEntity<>(helloWorld, requestHeaders); ListenableFuture> resultFuture = template.exchange(baseUrl + "/{method}", HttpMethod.POST, requestEntity, Void.class, "post"); final URI expected =new URI(baseUrl + "/post/1"); @@ -598,13 +576,12 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa assertEquals("Invalid location", expected, result.getHeaders().getLocation()); assertFalse(result.hasBody()); }, ex -> fail(ex.getMessage())); - while (!resultFuture.isDone()) { - } + waitTillDone(resultFuture); } @Test public void multipart() throws Exception { - MultiValueMap parts = new LinkedMultiValueMap(); + MultiValueMap parts = new LinkedMultiValueMap<>(); parts.add("name 1", "value 1"); parts.add("name 2", "value 2+1"); parts.add("name 2", "value 2+2"); @@ -646,6 +623,12 @@ public class AsyncRestTemplateIntegrationTests extends AbstractJettyServerTestCa assertNull(interceptor.exception); } + @SuppressWarnings("StatementWithEmptyBody") + private void waitTillDone(ListenableFuture future) { + while (!future.isDone()) { + } + } + private static class RequestInterceptor implements AsyncClientHttpRequestInterceptor { diff --git a/src/asciidoc/whats-new.adoc b/src/asciidoc/whats-new.adoc index 359ba9c44c8..abf5b79bb30 100644 --- a/src/asciidoc/whats-new.adoc +++ b/src/asciidoc/whats-new.adoc @@ -653,6 +653,7 @@ Spring 4.3 also improves the caching abstraction as follows: === Web Improvements * New `@RestControllerAdvice` annotation combines `@ControllerAdvice` with `@ResponseBody`. +* `AsyncRestTemplate` supports request interception. === Testing Improvements