diff --git a/src/docs/java/org/springframework/hateoas/EmployeeController.java b/src/docs/java/org/springframework/hateoas/EmployeeController.java index 277cf360..6bc85aa3 100644 --- a/src/docs/java/org/springframework/hateoas/EmployeeController.java +++ b/src/docs/java/org/springframework/hateoas/EmployeeController.java @@ -17,8 +17,6 @@ package org.springframework.hateoas; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -130,7 +128,7 @@ public class EmployeeController { Link link = linkTo(methodOn(getClass()).findOne(newEmployeeId)).withSelfRel().expand(); - return ResponseEntity.created(URI.create(link.getHref())).build(); + return ResponseEntity.created(link.toUri()).build(); } // end::new[] @@ -146,7 +144,7 @@ public class EmployeeController { Link link = linkTo(methodOn(getClass()).findOne(id)).withSelfRel().expand(); return ResponseEntity.noContent() // - .location(URI.create(link.getHref())) // + .location(link.toUri()) // .build(); } @@ -170,18 +168,9 @@ public class EmployeeController { EMPLOYEES.put(id, newEmployee); - try { - return ResponseEntity // - .noContent() // - .location( // - new URI(findOne(id) // - .getLink(IanaLinkRelations.SELF) // - .map(link -> link.expand().getHref()) // - .orElse("") // - ) // - ).build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity // + .noContent() // + .location(findOne(id).getRequiredLink(IanaLinkRelations.SELF).toUri()) // + .build(); } } diff --git a/src/main/asciidoc/client.adoc b/src/main/asciidoc/client.adoc index d2a55b95..a211415b 100644 --- a/src/main/asciidoc/client.adoc +++ b/src/main/asciidoc/client.adoc @@ -15,10 +15,10 @@ The following example shows how to use it: Map parameters = new HashMap<>(); parameters.put("user", 27); -Traverson traverson = new Traverson(new URI("http://localhost:8080/api/"), MediaTypes.HAL_JSON); -String name = traverson.follow("movies", "movie", "actor"). - withTemplateParameters(parameters). - toObject("$.name"); +Traverson traverson = new Traverson(URI.create("http://localhost:8080/api/"), MediaTypes.HAL_JSON); +String name = traverson + .follow("movies", "movie", "actor").withTemplateParameters(parameters) + .toObject("$.name"); ---- ==== diff --git a/src/test/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonWebMvcIntegrationTest.java b/src/test/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonWebMvcIntegrationTest.java index 35511452..f8e772be 100644 --- a/src/test/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonWebMvcIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonWebMvcIntegrationTest.java @@ -22,8 +22,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -37,11 +35,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.hateoas.MediaTypes; -import org.springframework.hateoas.EntityModel; -import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.config.EnableHypermediaSupport; import org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType; import org.springframework.hateoas.support.Employee; @@ -267,15 +265,10 @@ public class CollectionJsonWebMvcIntegrationTest { EMPLOYEES.put(newEmployeeId, employee.getContent()); - try { - return ResponseEntity.created(new URI(findOne(newEmployeeId) // - .getLink(IanaLinkRelations.SELF.value()) // - .map(link -> link.expand().getHref()) // - .orElse(""))) // - .build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity.created(findOne(newEmployeeId) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) // + .build(); } @PutMapping("/employees/{id}") @@ -283,16 +276,11 @@ public class CollectionJsonWebMvcIntegrationTest { EMPLOYEES.put(id, employee.getContent()); - try { - return ResponseEntity.noContent() // - .location(new URI(findOne(id) // - .getLink(IanaLinkRelations.SELF.value()) // - .map(link -> link.expand().getHref()) // - .orElse(""))) // - .build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity.noContent() // + .location(findOne(id) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) // + .build(); } @PatchMapping("/employees/{id}") @@ -312,16 +300,11 @@ public class CollectionJsonWebMvcIntegrationTest { EMPLOYEES.put(id, newEmployee); - try { - return ResponseEntity.noContent() // - .location(new URI(findOne(id) // - .getLink(IanaLinkRelations.SELF.value()) // - .map(link -> link.expand().getHref()) // - .orElse(""))) // - .build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity.noContent() // + .location(findOne(id) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) // + .build(); } } diff --git a/src/test/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsValidationIntegrationTest.java b/src/test/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsValidationIntegrationTest.java index 490af35e..95ac7537 100644 --- a/src/test/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsValidationIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsValidationIntegrationTest.java @@ -22,8 +22,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -35,11 +33,11 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.hateoas.MediaTypes; -import org.springframework.hateoas.EntityModel; -import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.config.EnableHypermediaSupport; import org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType; import org.springframework.hateoas.support.Employee; @@ -155,12 +153,11 @@ public class HalFormsValidationIntegrationTest { EMPLOYEES.put(newEmployeeId, employee); - try { - return ResponseEntity.noContent().location(new URI(findOne(newEmployeeId).getLink(IanaLinkRelations.SELF.value()) - .map(link -> link.expand().getHref()).orElse(""))).build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity.noContent() // + .location(findOne(newEmployeeId) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) // + .build(); } @PutMapping("/employees/{id}") @@ -168,17 +165,12 @@ public class HalFormsValidationIntegrationTest { EMPLOYEES.put(id, employee); - try { - return ResponseEntity // - .noContent() // - .location( // - new URI(findOne(id).getLink(IanaLinkRelations.SELF.value()) // - .map(link -> link.expand().getHref()) // - .orElse("")) // - ).build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity // + .noContent() // + .location(findOne(id) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) // + .build(); } @PatchMapping("/employees/{id}") @@ -196,18 +188,12 @@ public class HalFormsValidationIntegrationTest { EMPLOYEES.put(id, newEmployee); - try { - return ResponseEntity // - .noContent() // - .location( // - new URI(findOne(id) // - .getLink(IanaLinkRelations.SELF.value()) // - .map(link -> link.expand().getHref()) // - .orElse(""))) // - .build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity // + .noContent() // + .location(findOne(id) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) // + .build(); } } diff --git a/src/test/java/org/springframework/hateoas/server/mvc/MultiMediaTypeWebMvcIntegrationTest.java b/src/test/java/org/springframework/hateoas/server/mvc/MultiMediaTypeWebMvcIntegrationTest.java index b878f4ca..09062577 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/MultiMediaTypeWebMvcIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/MultiMediaTypeWebMvcIntegrationTest.java @@ -23,7 +23,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,11 +36,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; import org.springframework.hateoas.MediaTypes; -import org.springframework.hateoas.EntityModel; -import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.config.EnableHypermediaSupport; import org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType; import org.springframework.hateoas.mediatype.collectionjson.CollectionJsonLinkDiscoverer; @@ -507,11 +506,7 @@ public class MultiMediaTypeWebMvcIntegrationTest { EMPLOYEES.put(newEmployeeId, employee.getContent()); - try { - return ResponseEntity.created(toUri(newEmployeeId)).build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity.created(toUri(newEmployeeId)).build(); } @PutMapping("/employees/{id}") @@ -519,11 +514,7 @@ public class MultiMediaTypeWebMvcIntegrationTest { EMPLOYEES.put(id, employee.getContent()); - try { - return ResponseEntity.noContent().location(toUri(id)).build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity.noContent().location(toUri(id)).build(); } @PatchMapping("/employees/{id}") @@ -542,21 +533,14 @@ public class MultiMediaTypeWebMvcIntegrationTest { EMPLOYEES.put(id, newEmployee); - try { - return ResponseEntity.noContent().location(toUri(id)).build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity.noContent().location(toUri(id)).build(); } - private URI toUri(Integer id) throws URISyntaxException { + private URI toUri(Integer id) { - String uri = findOne(id) // - .getLink(IanaLinkRelations.SELF.value()) // - .map(link -> link.expand().getHref()) // - .orElse(""); - - return new URI(uri); + return findOne(id) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri(); } } diff --git a/src/test/java/org/springframework/hateoas/server/reactive/WebFluxLinkBuilderTest.java b/src/test/java/org/springframework/hateoas/server/reactive/WebFluxLinkBuilderTest.java index f85f2872..fea78f56 100644 --- a/src/test/java/org/springframework/hateoas/server/reactive/WebFluxLinkBuilderTest.java +++ b/src/test/java/org/springframework/hateoas/server/reactive/WebFluxLinkBuilderTest.java @@ -55,10 +55,10 @@ public class WebFluxLinkBuilderTest { * @see #728 */ @Test - public void linkAtSameLevelAsExplicitServerExchangeShouldWork() throws URISyntaxException { + public void linkAtSameLevelAsExplicitServerExchangeShouldWork() { when(this.exchange.getRequest()).thenReturn(this.request); - when(this.request.getURI()).thenReturn(new URI("http://localhost:8080/api")); + when(this.request.getURI()).thenReturn(URI.create("http://localhost:8080/api")); when(this.request.getHeaders()).thenReturn(new HttpHeaders()); linkTo(methodOn(TestController.class).root(), this.exchange).withSelfRel().toMono() // @@ -76,10 +76,10 @@ public class WebFluxLinkBuilderTest { * @see #728 */ @Test - public void linkAtSameLevelAsContextProvidedServerExchangeShouldWork() throws URISyntaxException { + public void linkAtSameLevelAsContextProvidedServerExchangeShouldWork() { when(this.exchange.getRequest()).thenReturn(this.request); - when(this.request.getURI()).thenReturn(new URI("http://localhost:8080/api")); + when(this.request.getURI()).thenReturn(URI.create("http://localhost:8080/api")); when(this.request.getHeaders()).thenReturn(new HttpHeaders()); linkTo(methodOn(TestController.class).root()).withSelfRel().toMono() // @@ -97,11 +97,11 @@ public class WebFluxLinkBuilderTest { * @see #728 */ @Test - public void shallowLinkFromDeepExplicitServerExchangeShouldWork() throws URISyntaxException { + public void shallowLinkFromDeepExplicitServerExchangeShouldWork() { when(this.exchange.getRequest()).thenReturn(this.request); - when(this.request.getURI()).thenReturn(new URI("http://localhost:8080/api/employees")); + when(this.request.getURI()).thenReturn(URI.create("http://localhost:8080/api/employees")); when(this.request.getHeaders()).thenReturn(new HttpHeaders()); linkTo(methodOn(TestController.class).root(), this.exchange).withSelfRel().toMono() // @@ -120,10 +120,10 @@ public class WebFluxLinkBuilderTest { * @see #728 */ @Test - public void shallowLinkFromDeepContextProvidedServerExchangeShouldWork() throws URISyntaxException { + public void shallowLinkFromDeepContextProvidedServerExchangeShouldWork() { when(this.exchange.getRequest()).thenReturn(this.request); - when(this.request.getURI()).thenReturn(new URI("http://localhost:8080/api/employees")); + when(this.request.getURI()).thenReturn(URI.create("http://localhost:8080/api/employees")); when(this.request.getHeaders()).thenReturn(new HttpHeaders()); linkTo(methodOn(TestController.class).root()).withSelfRel().toMono() // @@ -142,10 +142,10 @@ public class WebFluxLinkBuilderTest { * @see #728 */ @Test - public void deepLinkFromShallowExplicitServerExchangeShouldWork() throws URISyntaxException { + public void deepLinkFromShallowExplicitServerExchangeShouldWork() { when(this.exchange.getRequest()).thenReturn(this.request); - when(this.request.getURI()).thenReturn(new URI("http://localhost:8080/api")); + when(this.request.getURI()).thenReturn(URI.create("http://localhost:8080/api")); when(this.request.getHeaders()).thenReturn(new HttpHeaders()); linkTo(methodOn(TestController.class).deep(), this.exchange).withSelfRel().toMono() // @@ -163,10 +163,10 @@ public class WebFluxLinkBuilderTest { * @see #728 */ @Test - public void deepLinkFromShallowContextProvidedServerExchangeShouldWork() throws URISyntaxException { + public void deepLinkFromShallowContextProvidedServerExchangeShouldWork() { when(this.exchange.getRequest()).thenReturn(this.request); - when(this.request.getURI()).thenReturn(new URI("http://localhost:8080/api")); + when(this.request.getURI()).thenReturn(URI.create("http://localhost:8080/api")); when(this.request.getHeaders()).thenReturn(new HttpHeaders()); linkTo(methodOn(TestController.class).deep()).withSelfRel().toMono() // @@ -185,10 +185,10 @@ public class WebFluxLinkBuilderTest { * @see #728 */ @Test - public void linkToRouteWithNoMappingShouldWork() throws URISyntaxException { + public void linkToRouteWithNoMappingShouldWork() { when(this.exchange.getRequest()).thenReturn(this.request); - when(this.request.getURI()).thenReturn(new URI("http://localhost:8080/")); + when(this.request.getURI()).thenReturn(URI.create("http://localhost:8080/")); when(this.request.getHeaders()).thenReturn(new HttpHeaders()); linkTo(methodOn(TestController2.class).root()).withSelfRel().toMono() // diff --git a/src/test/java/org/springframework/hateoas/support/WebFluxEmployeeController.java b/src/test/java/org/springframework/hateoas/support/WebFluxEmployeeController.java index 43d8387e..955627dd 100644 --- a/src/test/java/org/springframework/hateoas/support/WebFluxEmployeeController.java +++ b/src/test/java/org/springframework/hateoas/support/WebFluxEmployeeController.java @@ -18,14 +18,12 @@ package org.springframework.hateoas.support; import static org.springframework.hateoas.server.reactive.WebFluxLinkBuilder.*; import static reactor.function.TupleUtils.*; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.net.URI; import java.util.Map; import java.util.Optional; import java.util.TreeMap; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import org.springframework.hateoas.Affordance; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.EntityModel; @@ -128,20 +126,17 @@ public class WebFluxEmployeeController { @PostMapping("/employees") public Mono> newEmployee(@RequestBody Mono> employee) { - return employee.flatMap(resource -> { + return employee // + .flatMap(resource -> { - int newEmployeeId = EMPLOYEES.size(); - EMPLOYEES.put(newEmployeeId, resource.getContent()); - return findOne(newEmployeeId); - - }).map(findOne -> { - - return ResponseEntity.created(URI.create(findOne // - .getLink(IanaLinkRelations.SELF) // - .map(link -> link.expand().getHref()) // - .orElse(""))) // - .build(); - }); + int newEmployeeId = EMPLOYEES.size(); + EMPLOYEES.put(newEmployeeId, resource.getContent()); + return findOne(newEmployeeId); + }) // + .map(findOne -> ResponseEntity.created(findOne // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) // + .build()); } @PutMapping("/employees/{id}") @@ -151,46 +146,34 @@ public class WebFluxEmployeeController { return employee.flatMap(resource -> { EMPLOYEES.put(id, resource.getContent()); return findOne(id); - }).map(findOne -> { - - return ResponseEntity.noContent() // - .location(URI.create(findOne // - .getLink(IanaLinkRelations.SELF) // - .map(link -> link.expand().getHref()) // - .orElse(""))) // - .build(); - }); + }).map(findOne -> ResponseEntity.noContent() // + .location(findOne.getRequiredLink(IanaLinkRelations.SELF).toUri()).build()); } @PatchMapping("/employees/{id}") public Mono> partiallyUpdateEmployee( // @RequestBody Mono> employee, @PathVariable Integer id) { - return employee.flatMap(resource -> { + return employee // + .flatMap(resource -> { - Employee oldEmployee = EMPLOYEES.get(id); - Employee newEmployee = oldEmployee; + Employee oldEmployee = EMPLOYEES.get(id); + Employee newEmployee = oldEmployee; - if (resource.getContent().getName() != null) { - newEmployee = newEmployee.withName(resource.getContent().getName()); - } + if (resource.getContent().getName() != null) { + newEmployee = newEmployee.withName(resource.getContent().getName()); + } - if (resource.getContent().getRole() != null) { - newEmployee = newEmployee.withRole(resource.getContent().getRole()); - } + if (resource.getContent().getRole() != null) { + newEmployee = newEmployee.withRole(resource.getContent().getRole()); + } - EMPLOYEES.put(id, newEmployee); + EMPLOYEES.put(id, newEmployee); - return findOne(id); + return findOne(id); - }).map(findOne -> { - - return ResponseEntity.noContent() // - .location(URI.create(findOne // - .getLink(IanaLinkRelations.SELF) // - .map(link -> link.expand().getHref()) // - .orElse(""))) // - .build(); - }); + }) // + .map(findOne -> ResponseEntity.noContent() // + .location(findOne.getRequiredLink(IanaLinkRelations.SELF).toUri()).build()); } } diff --git a/src/test/java/org/springframework/hateoas/support/WebMvcEmployeeController.java b/src/test/java/org/springframework/hateoas/support/WebMvcEmployeeController.java index 2ece71d6..2bdf131b 100644 --- a/src/test/java/org/springframework/hateoas/support/WebMvcEmployeeController.java +++ b/src/test/java/org/springframework/hateoas/support/WebMvcEmployeeController.java @@ -17,8 +17,6 @@ package org.springframework.hateoas.support; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -138,7 +136,7 @@ public class WebMvcEmployeeController { Link link = linkTo(methodOn(getClass()).findOne(newEmployeeId)).withSelfRel().expand(); - return ResponseEntity.created(URI.create(link.getHref())).build(); + return ResponseEntity.created(link.toUri()).build(); } @PutMapping("/employees/{id}") @@ -149,7 +147,7 @@ public class WebMvcEmployeeController { Link link = linkTo(methodOn(getClass()).findOne(id)).withSelfRel().expand(); return ResponseEntity.noContent() // - .location(URI.create(link.getHref())) // + .location(link.toUri()) // .build(); } @@ -170,18 +168,11 @@ public class WebMvcEmployeeController { EMPLOYEES.put(id, newEmployee); - try { - return ResponseEntity // - .noContent() // - .location( // - new URI(findOne(id) // - .getLink(IanaLinkRelations.SELF) // - .map(link -> link.expand().getHref()) // - .orElse("") // - ) // - ).build(); - } catch (URISyntaxException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } + return ResponseEntity // + .noContent() // + .location(findOne(id) // + .getRequiredLink(IanaLinkRelations.SELF) // + .toUri()) + .build(); } }