From 15db5a0513f173089cf5cef8cf69b80cae7f0c55 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Sun, 3 Mar 2019 10:52:08 -0600 Subject: [PATCH] Upgrade to latest Spring HATEOAS API changes. --- .../hateoas/examples/EmployeeController.java | 27 ++++++------ .../examples/EmployeeControllerTests.java | 2 +- .../hateoas/examples/HomeController.java | 10 ++--- .../hateoas/examples/Employee.java | 3 +- .../hateoas/examples/EmployeeController.java | 24 +++++----- .../examples/EmployeeResourceAssembler.java | 4 +- .../hateoas/examples/HomeController.java | 10 ++--- .../hateoas/examples/Employee.java | 4 +- .../hateoas/examples/EmployeeController.java | 28 ++++++------ ...EmployeeRepresentationModelAssembler.java} | 6 +-- .../hateoas/examples/Employee.java | 4 +- .../hateoas/examples/EmployeeController.java | 22 +++++----- ...EmployeeRepresentationModelAssembler.java} | 10 ++--- .../SpringHateoasBasicsApplication.java | 2 +- .../examples/EmployeeControllerTests.java | 2 +- ...tifiableRepresentationModelAssembler.java} | 44 ++++++++++++------- .../hateoas/examples/Employee.java | 4 +- .../hateoas/examples/EmployeeController.java | 32 +++++++------- ...EmployeeRepresentationModelAssembler.java} | 20 ++++----- .../EmployeeWithManagerResourceAssembler.java | 18 ++++---- .../hateoas/examples/Manager.java | 4 +- .../hateoas/examples/ManagerController.java | 24 +++++----- ... ManagerRepresentationModelAssembler.java} | 18 ++++---- .../hateoas/examples/RootController.java | 8 ++-- .../examples/SupervisorController.java | 8 ++-- pom.xml | 2 +- .../hateoas/examples/EmployeeController.java | 23 +++++----- .../SpringHateoasSimplifiedApplication.java | 2 +- 28 files changed, 185 insertions(+), 180 deletions(-) rename api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/{EmployeeResourceAssembler.java => EmployeeRepresentationModelAssembler.java} (77%) rename basics/src/main/java/org/springframework/hateoas/examples/{EmployeeResourceAssembler.java => EmployeeRepresentationModelAssembler.java} (67%) rename commons/src/main/java/org/springframework/hateoas/{SimpleIdentifiableResourceAssembler.java => SimpleIdentifiableRepresentationModelAssembler.java} (67%) rename hypermedia/src/main/java/org/springframework/hateoas/examples/{EmployeeResourceAssembler.java => EmployeeRepresentationModelAssembler.java} (74%) rename hypermedia/src/main/java/org/springframework/hateoas/examples/{ManagerResourceAssembler.java => ManagerRepresentationModelAssembler.java} (73%) diff --git a/affordances/src/main/java/org/springframework/hateoas/examples/EmployeeController.java b/affordances/src/main/java/org/springframework/hateoas/examples/EmployeeController.java index 51cbff8..1391cf1 100644 --- a/affordances/src/main/java/org/springframework/hateoas/examples/EmployeeController.java +++ b/affordances/src/main/java/org/springframework/hateoas/examples/EmployeeController.java @@ -15,7 +15,7 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.net.URI; import java.net.URISyntaxException; @@ -23,9 +23,10 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.CollectionModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -49,10 +50,10 @@ class EmployeeController { } @GetMapping("/employees") - ResponseEntity>> findAll() { + ResponseEntity>> findAll() { - List> employeeResources = StreamSupport.stream(repository.findAll().spliterator(), false) - .map(employee -> new Resource<>(employee, + List> employeeResources = StreamSupport.stream(repository.findAll().spliterator(), false) + .map(employee -> new EntityModel<>(employee, linkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).updateEmployee(null, employee.getId()))) .andAffordance(afford(methodOn(EmployeeController.class).deleteEmployee(employee.getId()))), @@ -60,7 +61,7 @@ class EmployeeController { )) .collect(Collectors.toList()); - return ResponseEntity.ok(new Resources<>(employeeResources, + return ResponseEntity.ok(new CollectionModel<>(employeeResources, linkTo(methodOn(EmployeeController.class).findAll()).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).newEmployee(null))))); } @@ -70,12 +71,12 @@ class EmployeeController { Employee savedEmployee = repository.save(employee); - return new Resource<>(savedEmployee, + return new EntityModel<>(savedEmployee, linkTo(methodOn(EmployeeController.class).findOne(savedEmployee.getId())).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).updateEmployee(null, savedEmployee.getId()))) .andAffordance(afford(methodOn(EmployeeController.class).deleteEmployee(savedEmployee.getId()))), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees") - ).getId() + ).getLink(IanaLinkRelations.SELF) .map(Link::getHref) .map(href -> { try { @@ -89,10 +90,10 @@ class EmployeeController { } @GetMapping("/employees/{id}") - ResponseEntity> findOne(@PathVariable long id) { + ResponseEntity> findOne(@PathVariable long id) { return repository.findById(id) - .map(employee -> new Resource<>(employee, + .map(employee -> new EntityModel<>(employee, linkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).updateEmployee(null, employee.getId()))) .andAffordance(afford(methodOn(EmployeeController.class).deleteEmployee(employee.getId()))), @@ -110,12 +111,12 @@ class EmployeeController { Employee updatedEmployee = repository.save(employeeToUpdate); - return new Resource<>(updatedEmployee, + return new EntityModel<>(updatedEmployee, linkTo(methodOn(EmployeeController.class).findOne(updatedEmployee.getId())).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).updateEmployee(null, updatedEmployee.getId()))) .andAffordance(afford(methodOn(EmployeeController.class).deleteEmployee(updatedEmployee.getId()))), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees") - ).getId() + ).getLink(IanaLinkRelations.SELF) .map(Link::getHref) .map(href -> { try { diff --git a/affordances/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java b/affordances/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java index 6158204..d34ba2a 100644 --- a/affordances/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java +++ b/affordances/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java @@ -137,4 +137,4 @@ public class EmployeeControllerTests { .andExpect(jsonPath("$._links.self.href", is("http://localhost/employees/1"))) .andExpect(jsonPath("$._links.employees.href", is("http://localhost/employees"))); } -} \ No newline at end of file +} diff --git a/api-evolution/new-client/src/main/java/org/springframework/hateoas/examples/HomeController.java b/api-evolution/new-client/src/main/java/org/springframework/hateoas/examples/HomeController.java index 910f58f..e3febd0 100644 --- a/api-evolution/new-client/src/main/java/org/springframework/hateoas/examples/HomeController.java +++ b/api-evolution/new-client/src/main/java/org/springframework/hateoas/examples/HomeController.java @@ -18,12 +18,12 @@ package org.springframework.hateoas.examples; import java.net.URI; import java.net.URISyntaxException; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.MediaTypes; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; import org.springframework.hateoas.client.Traverson; -import org.springframework.hateoas.mvc.TypeReferences.ResourcesType; +import org.springframework.hateoas.server.core.TypeReferences.CollectionModelType; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -62,9 +62,9 @@ public class HomeController { public String index(Model model) throws URISyntaxException { Traverson client = new Traverson(new URI(REMOTE_SERVICE_ROOT_URI), MediaTypes.HAL_JSON); - Resources> employees = client + CollectionModel> employees = client .follow("employees") - .toObject(new ResourcesType>(){}); + .toObject(new CollectionModelType>(){}); model.addAttribute("employee", new Employee()); model.addAttribute("employees", employees); diff --git a/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/Employee.java b/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/Employee.java index 8dca6cf..4f2b1cc 100644 --- a/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/Employee.java +++ b/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/Employee.java @@ -25,7 +25,6 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import org.springframework.hateoas.Identifiable; import org.springframework.util.StringUtils; /** @@ -37,7 +36,7 @@ import org.springframework.util.StringUtils; @Data @NoArgsConstructor @Entity -class Employee implements Identifiable { +class Employee { @Id @GeneratedValue private Long id; diff --git a/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java b/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java index a77eb97..a455934 100644 --- a/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java +++ b/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java @@ -15,11 +15,11 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.ResourceSupport; -import org.springframework.hateoas.Resources; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.RepresentationModel; +import org.springframework.hateoas.CollectionModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -43,9 +43,9 @@ class EmployeeController { } @GetMapping("/") - public ResourceSupport root() { + public RepresentationModel root() { - ResourceSupport rootResource = new ResourceSupport(); + RepresentationModel rootResource = new RepresentationModel(); rootResource.add( linkTo(methodOn(EmployeeController.class).root()).withSelfRel(), @@ -55,27 +55,27 @@ class EmployeeController { } @GetMapping("/employees") - public Resources> findAll() { - return assembler.toResources(repository.findAll()); + public CollectionModel> findAll() { + return assembler.toCollectionModel(repository.findAll()); } @PostMapping("/employees") - public ResponseEntity> newEmployee(@RequestBody Employee employee) { + public ResponseEntity> newEmployee(@RequestBody Employee employee) { Employee savedEmployee = repository.save(employee); return savedEmployee.getId() .map(id -> ResponseEntity .created(linkTo(methodOn(EmployeeController.class).findOne(id)).toUri()) - .body(assembler.toResource(savedEmployee))) + .body(assembler.toModel(savedEmployee))) .orElse(ResponseEntity.notFound().build()); } @GetMapping("/employees/{id}") - public ResponseEntity> findOne(@PathVariable Long id) { + public ResponseEntity> findOne(@PathVariable Long id) { return repository.findById(id) - .map(assembler::toResource) + .map(assembler::toModel) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } diff --git a/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java b/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java index 50a1325..8978a94 100644 --- a/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java +++ b/api-evolution/new-server/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java @@ -15,14 +15,14 @@ */ package org.springframework.hateoas.examples; -import org.springframework.hateoas.SimpleIdentifiableResourceAssembler; +import org.springframework.hateoas.SimpleIdentifiableRepresentationModelAssembler; import org.springframework.stereotype.Component; /** * @author Greg Turnquist */ @Component -class EmployeeResourceAssembler extends SimpleIdentifiableResourceAssembler { +class EmployeeResourceAssembler extends SimpleIdentifiableRepresentationModelAssembler { EmployeeResourceAssembler() { super(EmployeeController.class); diff --git a/api-evolution/original-client/src/main/java/org/springframework/hateoas/examples/HomeController.java b/api-evolution/original-client/src/main/java/org/springframework/hateoas/examples/HomeController.java index 910f58f..e3febd0 100644 --- a/api-evolution/original-client/src/main/java/org/springframework/hateoas/examples/HomeController.java +++ b/api-evolution/original-client/src/main/java/org/springframework/hateoas/examples/HomeController.java @@ -18,12 +18,12 @@ package org.springframework.hateoas.examples; import java.net.URI; import java.net.URISyntaxException; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.MediaTypes; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; import org.springframework.hateoas.client.Traverson; -import org.springframework.hateoas.mvc.TypeReferences.ResourcesType; +import org.springframework.hateoas.server.core.TypeReferences.CollectionModelType; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -62,9 +62,9 @@ public class HomeController { public String index(Model model) throws URISyntaxException { Traverson client = new Traverson(new URI(REMOTE_SERVICE_ROOT_URI), MediaTypes.HAL_JSON); - Resources> employees = client + CollectionModel> employees = client .follow("employees") - .toObject(new ResourcesType>(){}); + .toObject(new CollectionModelType>(){}); model.addAttribute("employee", new Employee()); model.addAttribute("employees", employees); diff --git a/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/Employee.java b/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/Employee.java index afff895..be85585 100644 --- a/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/Employee.java +++ b/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/Employee.java @@ -25,15 +25,13 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import org.springframework.hateoas.Identifiable; - /** * @author Greg Turnquist */ @Data @NoArgsConstructor(access = AccessLevel.PRIVATE) @Entity -class Employee implements Identifiable { +class Employee { @Id @GeneratedValue private Long id; diff --git a/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java b/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java index 0b79244..0ba9f0c 100644 --- a/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java +++ b/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeController.java @@ -15,11 +15,11 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.ResourceSupport; -import org.springframework.hateoas.Resources; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.RepresentationModel; +import org.springframework.hateoas.CollectionModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -34,18 +34,18 @@ import org.springframework.web.bind.annotation.RestController; class EmployeeController { private final EmployeeRepository repository; - private final EmployeeResourceAssembler assembler; + private final EmployeeRepresentationModelAssembler assembler; - EmployeeController(EmployeeRepository repository, EmployeeResourceAssembler assembler) { + EmployeeController(EmployeeRepository repository, EmployeeRepresentationModelAssembler assembler) { this.repository = repository; this.assembler = assembler; } @GetMapping("/") - public ResourceSupport root() { + public RepresentationModel root() { - ResourceSupport rootResource = new ResourceSupport(); + RepresentationModel rootResource = new RepresentationModel(); rootResource.add( linkTo(methodOn(EmployeeController.class).root()).withSelfRel(), @@ -55,12 +55,12 @@ class EmployeeController { } @GetMapping("/employees") - public Resources> findAll() { - return assembler.toResources(repository.findAll()); + public CollectionModel> findAll() { + return assembler.toCollectionModel(repository.findAll()); } @PostMapping("/employees") - public ResponseEntity> newEmployee(@RequestBody Employee employee) { + public ResponseEntity> newEmployee(@RequestBody Employee employee) { Employee savedEmployee = repository.save(employee); @@ -68,13 +68,13 @@ class EmployeeController { .created(savedEmployee.getId() .map(id -> linkTo(methodOn(EmployeeController.class).findOne(id)).toUri()) .orElseThrow(() -> new RuntimeException("Failed to create for some reason"))) - .body(assembler.toResource(savedEmployee)); + .body(assembler.toModel(savedEmployee)); } @GetMapping("/employees/{id}") - public Resource findOne(@PathVariable Long id) { + public EntityModel findOne(@PathVariable Long id) { return repository.findById(id) - .map(assembler::toResource) + .map(assembler::toModel) .orElseThrow(() -> new RuntimeException("No employee '" + id + "' found")); } diff --git a/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java b/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java similarity index 77% rename from api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java rename to api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java index 50a1325..e33b5e2 100644 --- a/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java +++ b/api-evolution/original-server/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java @@ -15,16 +15,16 @@ */ package org.springframework.hateoas.examples; -import org.springframework.hateoas.SimpleIdentifiableResourceAssembler; +import org.springframework.hateoas.SimpleIdentifiableRepresentationModelAssembler; import org.springframework.stereotype.Component; /** * @author Greg Turnquist */ @Component -class EmployeeResourceAssembler extends SimpleIdentifiableResourceAssembler { +class EmployeeRepresentationModelAssembler extends SimpleIdentifiableRepresentationModelAssembler { - EmployeeResourceAssembler() { + EmployeeRepresentationModelAssembler() { super(EmployeeController.class); } } diff --git a/basics/src/main/java/org/springframework/hateoas/examples/Employee.java b/basics/src/main/java/org/springframework/hateoas/examples/Employee.java index cd809a6..ab9091e 100644 --- a/basics/src/main/java/org/springframework/hateoas/examples/Employee.java +++ b/basics/src/main/java/org/springframework/hateoas/examples/Employee.java @@ -26,8 +26,6 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import org.springframework.hateoas.Identifiable; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** @@ -51,7 +49,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) -class Employee implements Identifiable { +class Employee { @Id @GeneratedValue private Long id; diff --git a/basics/src/main/java/org/springframework/hateoas/examples/EmployeeController.java b/basics/src/main/java/org/springframework/hateoas/examples/EmployeeController.java index b5a5c8d..cb02a3e 100644 --- a/basics/src/main/java/org/springframework/hateoas/examples/EmployeeController.java +++ b/basics/src/main/java/org/springframework/hateoas/examples/EmployeeController.java @@ -15,8 +15,8 @@ */ package org.springframework.hateoas.examples; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.CollectionModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController; /** * Spring Web {@link RestController} used to generate a REST API. * - * Works by injecting an {@link EmployeeRepository} and an {@link EmployeeResourceAssembler} in the constructor, both + * Works by injecting an {@link EmployeeRepository} and an {@link EmployeeRepresentationModelAssembler} in the constructor, both * of which are used to retrieve data from the database, and assemble a REST resource. * * @author Greg Turnquist @@ -34,9 +34,9 @@ import org.springframework.web.bind.annotation.RestController; class EmployeeController { private final EmployeeRepository repository; - private final EmployeeResourceAssembler assembler; + private final EmployeeRepresentationModelAssembler assembler; - EmployeeController(EmployeeRepository repository, EmployeeResourceAssembler assembler) { + EmployeeController(EmployeeRepository repository, EmployeeRepresentationModelAssembler assembler) { this.repository = repository; this.assembler = assembler; @@ -44,29 +44,29 @@ class EmployeeController { /** * Look up all employees, and transform them into a REST collection resource using - * {@link EmployeeResourceAssembler#toResources(Iterable)}. Then return them through + * {@link EmployeeRepresentationModelAssembler#toCollectionModel(Iterable)}. Then return them through * Spring Web's {@link ResponseEntity} fluent API. */ @GetMapping("/employees") - public ResponseEntity>> findAll() { + public ResponseEntity>> findAll() { return ResponseEntity.ok( - this.assembler.toResources(this.repository.findAll())); + this.assembler.toCollectionModel(this.repository.findAll())); } /** * Look up a single {@link Employee} and transform it into a REST resource using - * {@link EmployeeResourceAssembler#toResource(Object)}. Then return it through + * {@link EmployeeRepresentationModelAssembler#toModel(Object)}. Then return it through * Spring Web's {@link ResponseEntity} fluent API. * * @param id */ @GetMapping("/employees/{id}") - public ResponseEntity> findOne(@PathVariable long id) { + public ResponseEntity> findOne(@PathVariable long id) { return this.repository.findById(id) - .map(this.assembler::toResource) + .map(this.assembler::toModel) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } diff --git a/basics/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java b/basics/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java similarity index 67% rename from basics/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java rename to basics/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java index f2a8444..b943dce 100644 --- a/basics/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java +++ b/basics/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java @@ -15,21 +15,21 @@ */ package org.springframework.hateoas.examples; -import org.springframework.hateoas.SimpleIdentifiableResourceAssembler; +import org.springframework.hateoas.SimpleIdentifiableRepresentationModelAssembler; import org.springframework.stereotype.Component; /** * @author Greg Turnquist */ @Component -class EmployeeResourceAssembler extends SimpleIdentifiableResourceAssembler { +class EmployeeRepresentationModelAssembler extends SimpleIdentifiableRepresentationModelAssembler { /** * Link the {@link Employee} domain type to the {@link EmployeeController} using this - * {@link SimpleIdentifiableResourceAssembler} in order to generate both {@link org.springframework.hateoas.Resource} - * and {@link org.springframework.hateoas.Resources}. + * {@link SimpleIdentifiableRepresentationModelAssembler} in order to generate both {@link org.springframework.hateoas.Resource} + * and {@link org.springframework.hateoas.CollectionModel}. */ - EmployeeResourceAssembler() { + EmployeeRepresentationModelAssembler() { super(EmployeeController.class); } } diff --git a/basics/src/main/java/org/springframework/hateoas/examples/SpringHateoasBasicsApplication.java b/basics/src/main/java/org/springframework/hateoas/examples/SpringHateoasBasicsApplication.java index a4da4c1..8f1e777 100644 --- a/basics/src/main/java/org/springframework/hateoas/examples/SpringHateoasBasicsApplication.java +++ b/basics/src/main/java/org/springframework/hateoas/examples/SpringHateoasBasicsApplication.java @@ -19,7 +19,7 @@ package org.springframework.hateoas.examples; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.hateoas.core.EvoInflectorRelProvider; +import org.springframework.hateoas.server.core.EvoInflectorRelProvider; /** * @author Greg Turnquist diff --git a/basics/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java b/basics/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java index 393aabb..9465461 100644 --- a/basics/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java +++ b/basics/src/test/java/org/springframework/hateoas/examples/EmployeeControllerTests.java @@ -42,7 +42,7 @@ import org.springframework.test.web.servlet.MockMvc; */ @RunWith(SpringRunner.class) @WebMvcTest(EmployeeController.class) -@Import({EmployeeResourceAssembler.class}) +@Import({EmployeeRepresentationModelAssembler.class}) public class EmployeeControllerTests { @Autowired diff --git a/commons/src/main/java/org/springframework/hateoas/SimpleIdentifiableResourceAssembler.java b/commons/src/main/java/org/springframework/hateoas/SimpleIdentifiableRepresentationModelAssembler.java similarity index 67% rename from commons/src/main/java/org/springframework/hateoas/SimpleIdentifiableResourceAssembler.java rename to commons/src/main/java/org/springframework/hateoas/SimpleIdentifiableRepresentationModelAssembler.java index 4f86087..894542e 100644 --- a/commons/src/main/java/org/springframework/hateoas/SimpleIdentifiableResourceAssembler.java +++ b/commons/src/main/java/org/springframework/hateoas/SimpleIdentifiableRepresentationModelAssembler.java @@ -15,22 +15,28 @@ */ package org.springframework.hateoas; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import lombok.Getter; import lombok.Setter; +import java.lang.reflect.Field; + import org.springframework.core.GenericTypeResolver; -import org.springframework.hateoas.core.EvoInflectorRelProvider; -import org.springframework.hateoas.mvc.ControllerLinkBuilder; +import org.springframework.hateoas.server.LinkBuilder; +import org.springframework.hateoas.server.RelProvider; +import org.springframework.hateoas.server.SimpleRepresentationModelAssembler; +import org.springframework.hateoas.server.core.EvoInflectorRelProvider; +import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; +import org.springframework.util.ReflectionUtils; /** - * A {@link SimpleResourceAssembler} that mixes together a Spring web controller and a {@link RelProvider} to build links + * A {@link SimpleRepresentationModelAssembler} that mixes together a Spring web controller and a {@link RelProvider} to build links * upon a certain strategy. * * @author Greg Turnquist */ -public class SimpleIdentifiableResourceAssembler> implements SimpleResourceAssembler { +public class SimpleIdentifiableRepresentationModelAssembler implements SimpleRepresentationModelAssembler { /** * The Spring MVC class for the {@link Identifiable} from which links will be built. @@ -61,13 +67,13 @@ public class SimpleIdentifiableResourceAssembler> impl * @param controllerClass - Spring MVC controller to base links off of * @param relProvider */ - public SimpleIdentifiableResourceAssembler(Class controllerClass, RelProvider relProvider) { + public SimpleIdentifiableRepresentationModelAssembler(Class controllerClass, RelProvider relProvider) { this.controllerClass = controllerClass; this.relProvider = relProvider; - // Find the "T" type contained in "T extends Identifiable", e.g. SimpleIdentifiableResourceAssembler -> User - this.resourceType = GenericTypeResolver.resolveTypeArgument(this.getClass(), SimpleIdentifiableResourceAssembler.class); + // Find the "T" type contained in "T extends Identifiable", e.g. SimpleIdentifiableRepresentationModelAssembler -> User + this.resourceType = GenericTypeResolver.resolveTypeArgument(this.getClass(), SimpleIdentifiableRepresentationModelAssembler.class); } /** @@ -75,7 +81,7 @@ public class SimpleIdentifiableResourceAssembler> impl * * @param controllerClass */ - public SimpleIdentifiableResourceAssembler(Class controllerClass) { + public SimpleIdentifiableRepresentationModelAssembler(Class controllerClass) { this(controllerClass, new EvoInflectorRelProvider()); } @@ -85,20 +91,26 @@ public class SimpleIdentifiableResourceAssembler> impl * * @param resource */ - @Override - public void addLinks(Resource resource) { + public void addLinks(EntityModel resource) { - resource.add(getCollectionLinkBuilder().slash(resource.getContent()).withSelfRel()); + resource.add(getCollectionLinkBuilder().slash(getId(resource)).withSelfRel()); resource.add(getCollectionLinkBuilder().withRel(this.relProvider.getCollectionResourceRelFor(this.resourceType))); } + private Object getId(EntityModel resource) { + + Field id = ReflectionUtils.findField(this.resourceType, "id"); + ReflectionUtils.makeAccessible(id); + + return ReflectionUtils.getField(id, resource.getContent()); + } + /** * Add a self link to the aggregate root. * * @param resources */ - @Override - public void addLinks(Resources> resources) { + public void addLinks(CollectionModel> resources) { resources.add(getCollectionLinkBuilder().withSelfRel()); } @@ -110,14 +122,14 @@ public class SimpleIdentifiableResourceAssembler> impl * objects will be serving resources at {@code /employees} and {@code /employees/1}. * * If this is not the case, simply override this method in your concrete instance, or resort to - * overriding {@link #addLinks(Resource)} and {@link #addLinks(Resources)} where you have full control over exactly + * overriding {@link #addLinks(EntityModel)} and {@link #addLinks(CollectionModel)} where you have full control over exactly * what links are put in the individual and collection resources. * * @return */ protected LinkBuilder getCollectionLinkBuilder() { - ControllerLinkBuilder linkBuilder = linkTo(this.controllerClass); + WebMvcLinkBuilder linkBuilder = linkTo(this.controllerClass); for (String pathComponent : (getPrefix() + this.relProvider.getCollectionResourceRelFor(this.resourceType)).split("/")) { if (!pathComponent.isEmpty()) { diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/Employee.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/Employee.java index cbf7eca..d2167f2 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/Employee.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/Employee.java @@ -25,8 +25,6 @@ import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; -import org.springframework.hateoas.Identifiable; - import com.fasterxml.jackson.annotation.JsonIgnore; /** @@ -35,7 +33,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; @Data @Entity @NoArgsConstructor -class Employee implements Identifiable { +class Employee { @Id @GeneratedValue private Long id; diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeController.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeController.java index 1b90db3..eaf448a 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeController.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeController.java @@ -18,8 +18,8 @@ package org.springframework.hateoas.examples; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.CollectionModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -32,10 +32,10 @@ import org.springframework.web.bind.annotation.RestController; class EmployeeController { private final EmployeeRepository repository; - private final EmployeeResourceAssembler assembler; + private final EmployeeRepresentationModelAssembler assembler; private final EmployeeWithManagerResourceAssembler employeeWithManagerResourceAssembler; - EmployeeController(EmployeeRepository repository, EmployeeResourceAssembler assembler, + EmployeeController(EmployeeRepository repository, EmployeeRepresentationModelAssembler assembler, EmployeeWithManagerResourceAssembler employeeWithManagerResourceAssembler) { this.repository = repository; @@ -45,28 +45,28 @@ class EmployeeController { /** * Look up all employees, and transform them into a REST collection resource using - * {@link EmployeeResourceAssembler#toResources(Iterable)}. Then return them through + * {@link EmployeeRepresentationModelAssembler#toCollectionModel(Iterable)}. Then return them through * Spring Web's {@link ResponseEntity} fluent API. */ @GetMapping("/employees") - public ResponseEntity>> findAll() { + public ResponseEntity>> findAll() { return ResponseEntity.ok( - assembler.toResources(repository.findAll())); + assembler.toCollectionModel(repository.findAll())); } /** * Look up a single {@link Employee} and transform it into a REST resource using - * {@link EmployeeResourceAssembler#toResource(Object)}. Then return it through + * {@link EmployeeRepresentationModelAssembler#toModel(Object)}. Then return it through * Spring Web's {@link ResponseEntity} fluent API. * * @param id */ @GetMapping("/employees/{id}") - public ResponseEntity> findOne(@PathVariable long id) { + public ResponseEntity> findOne(@PathVariable long id) { return repository.findById(id) - .map(assembler::toResource) + .map(assembler::toModel) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @@ -78,27 +78,27 @@ class EmployeeController { * @return */ @GetMapping("/managers/{id}/employees") - public ResponseEntity>> findEmployees(@PathVariable long id) { + public ResponseEntity>> findEmployees(@PathVariable long id) { return ResponseEntity.ok( - assembler.toResources(repository.findByManagerId(id))); + assembler.toCollectionModel(repository.findByManagerId(id))); } @GetMapping("/employees/detailed") - public ResponseEntity>> findAllDetailedEmployees() { + public ResponseEntity>> findAllDetailedEmployees() { return ResponseEntity.ok( - employeeWithManagerResourceAssembler.toResources( + employeeWithManagerResourceAssembler.toCollectionModel( StreamSupport.stream(repository.findAll().spliterator(), false) .map(EmployeeWithManager::new) .collect(Collectors.toList()))); } @GetMapping("/employees/{id}/detailed") - public ResponseEntity> findDetailedEmployee(@PathVariable Long id) { + public ResponseEntity> findDetailedEmployee(@PathVariable Long id) { return repository.findById(id) .map(EmployeeWithManager::new) - .map(employeeWithManagerResourceAssembler::toResource) + .map(employeeWithManagerResourceAssembler::toModel) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java similarity index 74% rename from hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java rename to hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java index 5f1d2c9..dc0bced 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeResourceAssembler.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeRepresentationModelAssembler.java @@ -15,30 +15,30 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; -import org.springframework.hateoas.SimpleIdentifiableResourceAssembler; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.SimpleIdentifiableRepresentationModelAssembler; import org.springframework.stereotype.Component; /** * @author Greg Turnquist */ @Component -class EmployeeResourceAssembler extends SimpleIdentifiableResourceAssembler { +class EmployeeRepresentationModelAssembler extends SimpleIdentifiableRepresentationModelAssembler { - EmployeeResourceAssembler() { + EmployeeRepresentationModelAssembler() { super(EmployeeController.class); } /** - * Define links to add to every {@link Resource}. + * Define links to add to every {@link EntityModel}. * * @param resource */ @Override - public void addLinks(Resource resource) { + public void addLinks(EntityModel resource) { /** * Add some custom links to the default ones provided. @@ -59,12 +59,12 @@ class EmployeeResourceAssembler extends SimpleIdentifiableResourceAssembler> resources) { + public void addLinks(CollectionModel> resources) { super.addLinks(resources); diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeWithManagerResourceAssembler.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeWithManagerResourceAssembler.java index dc31ccc..9f8d899 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeWithManagerResourceAssembler.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/EmployeeWithManagerResourceAssembler.java @@ -15,26 +15,26 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; -import org.springframework.hateoas.SimpleResourceAssembler; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.server.SimpleRepresentationModelAssembler; import org.springframework.stereotype.Component; /** * @author Greg Turnquist */ @Component -class EmployeeWithManagerResourceAssembler implements SimpleResourceAssembler { +class EmployeeWithManagerResourceAssembler implements SimpleRepresentationModelAssembler { /** - * Define links to add to every individual {@link Resource}. + * Define links to add to every individual {@link EntityModel}. * * @param resource */ @Override - public void addLinks(Resource resource) { + public void addLinks(EntityModel resource) { resource.add(linkTo(methodOn(EmployeeController.class).findDetailedEmployee(resource.getContent().getId())).withSelfRel()); resource.add(linkTo(methodOn(EmployeeController.class).findOne(resource.getContent().getId())).withRel("summary")); @@ -42,12 +42,12 @@ class EmployeeWithManagerResourceAssembler implements SimpleResourceAssembler> resources) { + public void addLinks(CollectionModel> resources) { resources.add(linkTo(methodOn(EmployeeController.class).findAllDetailedEmployees()).withSelfRel()); resources.add(linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees")); diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/Manager.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/Manager.java index 5a3a4c5..1fe6994 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/Manager.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/Manager.java @@ -27,8 +27,6 @@ import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; -import org.springframework.hateoas.Identifiable; - import com.fasterxml.jackson.annotation.JsonIgnore; /** @@ -37,7 +35,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; @Data @Entity @NoArgsConstructor -class Manager implements Identifiable { +class Manager { @Id @GeneratedValue private Long id; diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerController.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerController.java index 84b73c3..fdd3a72 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerController.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerController.java @@ -15,8 +15,8 @@ */ package org.springframework.hateoas.examples; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.CollectionModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -29,9 +29,9 @@ import org.springframework.web.bind.annotation.RestController; class ManagerController { private final ManagerRepository repository; - private final ManagerResourceAssembler assembler; + private final ManagerRepresentationModelAssembler assembler; - ManagerController(ManagerRepository repository, ManagerResourceAssembler assembler) { + ManagerController(ManagerRepository repository, ManagerRepresentationModelAssembler assembler) { this.repository = repository; this.assembler = assembler; @@ -39,28 +39,28 @@ class ManagerController { /** * Look up all managers, and transform them into a REST collection resource using - * {@link ManagerResourceAssembler#toResources(Iterable)}. Then return them through + * {@link ManagerRepresentationModelAssembler#toCollectionModel(Iterable)}. Then return them through * Spring Web's {@link ResponseEntity} fluent API. */ @GetMapping("/managers") - ResponseEntity>> findAll() { + ResponseEntity>> findAll() { return ResponseEntity.ok( - assembler.toResources(repository.findAll())); + assembler.toCollectionModel(repository.findAll())); } /** * Look up a single {@link Manager} and transform it into a REST resource using - * {@link ManagerResourceAssembler#toResource(Object)}. Then return it through + * {@link ManagerRepresentationModelAssembler#toModel(Object)}. Then return it through * Spring Web's {@link ResponseEntity} fluent API. * * @param id */ @GetMapping("/managers/{id}") - ResponseEntity> findOne(@PathVariable long id) { + ResponseEntity> findOne(@PathVariable long id) { return repository.findById(id) - .map(assembler::toResource) + .map(assembler::toModel) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @@ -72,8 +72,8 @@ class ManagerController { * @return */ @GetMapping("/employees/{id}/manager") - ResponseEntity> findManager(@PathVariable long id) { + ResponseEntity> findManager(@PathVariable long id) { return ResponseEntity.ok( - assembler.toResource(repository.findByEmployeesId(id))); + assembler.toModel(repository.findByEmployeesId(id))); } } diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerResourceAssembler.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerRepresentationModelAssembler.java similarity index 73% rename from hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerResourceAssembler.java rename to hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerRepresentationModelAssembler.java index fc8e1c2..b548c29 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerResourceAssembler.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/ManagerRepresentationModelAssembler.java @@ -15,30 +15,30 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; -import org.springframework.hateoas.SimpleIdentifiableResourceAssembler; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.SimpleIdentifiableRepresentationModelAssembler; import org.springframework.stereotype.Component; /** * @author Greg Turnquist */ @Component -class ManagerResourceAssembler extends SimpleIdentifiableResourceAssembler { +class ManagerRepresentationModelAssembler extends SimpleIdentifiableRepresentationModelAssembler { - ManagerResourceAssembler() { + ManagerRepresentationModelAssembler() { super(ManagerController.class); } /** - * Retain default links provided by {@link SimpleIdentifiableResourceAssembler}, but add extra ones to each {@link Manager}. + * Retain default links provided by {@link SimpleIdentifiableRepresentationModelAssembler}, but add extra ones to each {@link Manager}. * * @param resource */ @Override - public void addLinks(Resource resource) { + public void addLinks(EntityModel resource) { /** * Retain default links. */ @@ -57,7 +57,7 @@ class ManagerResourceAssembler extends SimpleIdentifiableResourceAssembler> resources) { + public void addLinks(CollectionModel> resources) { super.addLinks(resources); diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/RootController.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/RootController.java index 9c95267..170646f 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/RootController.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/RootController.java @@ -15,9 +15,9 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.RepresentationModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -29,9 +29,9 @@ import org.springframework.web.bind.annotation.RestController; class RootController { @GetMapping("/") - ResponseEntity root() { + ResponseEntity root() { - ResourceSupport resourceSupport = new ResourceSupport(); + RepresentationModel resourceSupport = new RepresentationModel(); resourceSupport.add(linkTo(methodOn(RootController.class).root()).withSelfRel()); resourceSupport.add(linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees")); diff --git a/hypermedia/src/main/java/org/springframework/hateoas/examples/SupervisorController.java b/hypermedia/src/main/java/org/springframework/hateoas/examples/SupervisorController.java index 2448c8f..f3a7ceb 100644 --- a/hypermedia/src/main/java/org/springframework/hateoas/examples/SupervisorController.java +++ b/hypermedia/src/main/java/org/springframework/hateoas/examples/SupervisorController.java @@ -15,7 +15,7 @@ */ package org.springframework.hateoas.examples; -import org.springframework.hateoas.Resource; +import org.springframework.hateoas.EntityModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -37,10 +37,10 @@ public class SupervisorController { } @GetMapping("/supervisors/{id}") - public ResponseEntity> findOne(@PathVariable Long id) { + public ResponseEntity> findOne(@PathVariable Long id) { - Resource managerResource = controller.findOne(id).getBody(); - Resource supervisorResource = new Resource<>( + EntityModel managerResource = controller.findOne(id).getBody(); + EntityModel supervisorResource = new EntityModel<>( new Supervisor(managerResource.getContent()), managerResource.getLinks()); diff --git a/pom.xml b/pom.xml index c81018f..bfb32c9 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.2.RELEASE + 2.2.0.BUILD-SNAPSHOT diff --git a/simplified/src/main/java/org/springframework/hateoas/examples/EmployeeController.java b/simplified/src/main/java/org/springframework/hateoas/examples/EmployeeController.java index afb2a0a..402e101 100644 --- a/simplified/src/main/java/org/springframework/hateoas/examples/EmployeeController.java +++ b/simplified/src/main/java/org/springframework/hateoas/examples/EmployeeController.java @@ -15,7 +15,7 @@ */ package org.springframework.hateoas.examples; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.net.URI; import java.net.URISyntaxException; @@ -23,9 +23,10 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; -import org.springframework.hateoas.Resource; -import org.springframework.hateoas.Resources; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.CollectionModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -53,16 +54,16 @@ class EmployeeController { * Then return them through Spring Web's {@link ResponseEntity} fluent API. */ @GetMapping("/employees") - ResponseEntity>> findAll() { + ResponseEntity>> findAll() { - List> employees = StreamSupport.stream(repository.findAll().spliterator(), false) - .map(employee -> new Resource<>(employee, + List> employees = StreamSupport.stream(repository.findAll().spliterator(), false) + .map(employee -> new EntityModel<>(employee, linkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel(), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees"))) .collect(Collectors.toList()); return ResponseEntity.ok( - new Resources<>(employees, + new CollectionModel<>(employees, linkTo(methodOn(EmployeeController.class).findAll()).withSelfRel())); } @@ -72,11 +73,11 @@ class EmployeeController { try { Employee savedEmployee = repository.save(employee); - Resource employeeResource = new Resource<>(savedEmployee, + EntityModel employeeResource = new EntityModel<>(savedEmployee, linkTo(methodOn(EmployeeController.class).findOne(savedEmployee.getId())).withSelfRel()); return ResponseEntity - .created(new URI(employeeResource.getRequiredLink(Link.REL_SELF).getHref())) + .created(new URI(employeeResource.getRequiredLink(IanaLinkRelations.SELF).getHref())) .body(employeeResource); } catch (URISyntaxException e) { return ResponseEntity.badRequest().body("Unable to create " + employee); @@ -90,10 +91,10 @@ class EmployeeController { * @param id */ @GetMapping("/employees/{id}") - ResponseEntity> findOne(@PathVariable long id) { + ResponseEntity> findOne(@PathVariable long id) { return repository.findById(id) - .map(employee -> new Resource<>(employee, + .map(employee -> new EntityModel<>(employee, linkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel(), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees"))) .map(ResponseEntity::ok) diff --git a/simplified/src/main/java/org/springframework/hateoas/examples/SpringHateoasSimplifiedApplication.java b/simplified/src/main/java/org/springframework/hateoas/examples/SpringHateoasSimplifiedApplication.java index 8df9ea4..a107258 100644 --- a/simplified/src/main/java/org/springframework/hateoas/examples/SpringHateoasSimplifiedApplication.java +++ b/simplified/src/main/java/org/springframework/hateoas/examples/SpringHateoasSimplifiedApplication.java @@ -19,7 +19,7 @@ package org.springframework.hateoas.examples; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.hateoas.core.EvoInflectorRelProvider; +import org.springframework.hateoas.server.core.EvoInflectorRelProvider; /** * @author Greg Turnquist