Upgrade to latest Spring HATEOAS API changes.

This commit is contained in:
Greg Turnquist
2019-03-03 10:52:08 -06:00
parent 35c74de6cb
commit 15db5a0513
28 changed files with 185 additions and 180 deletions

View File

@@ -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<T extends Identifiable<?>> implements SimpleResourceAssembler<T> {
public class SimpleIdentifiableRepresentationModelAssembler<T> implements SimpleRepresentationModelAssembler<T> {
/**
* The Spring MVC class for the {@link Identifiable} from which links will be built.
@@ -61,13 +67,13 @@ public class SimpleIdentifiableResourceAssembler<T extends Identifiable<?>> 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> -> User
this.resourceType = GenericTypeResolver.resolveTypeArgument(this.getClass(), SimpleIdentifiableResourceAssembler.class);
// Find the "T" type contained in "T extends Identifiable<?>", e.g. SimpleIdentifiableRepresentationModelAssembler<User> -> User
this.resourceType = GenericTypeResolver.resolveTypeArgument(this.getClass(), SimpleIdentifiableRepresentationModelAssembler.class);
}
/**
@@ -75,7 +81,7 @@ public class SimpleIdentifiableResourceAssembler<T extends Identifiable<?>> impl
*
* @param controllerClass
*/
public SimpleIdentifiableResourceAssembler(Class<?> controllerClass) {
public SimpleIdentifiableRepresentationModelAssembler(Class<?> controllerClass) {
this(controllerClass, new EvoInflectorRelProvider());
}
@@ -85,20 +91,26 @@ public class SimpleIdentifiableResourceAssembler<T extends Identifiable<?>> impl
*
* @param resource
*/
@Override
public void addLinks(Resource<T> resource) {
public void addLinks(EntityModel<T> 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<T> 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<Resource<T>> resources) {
public void addLinks(CollectionModel<EntityModel<T>> resources) {
resources.add(getCollectionLinkBuilder().withSelfRel());
}
@@ -110,14 +122,14 @@ public class SimpleIdentifiableResourceAssembler<T extends Identifiable<?>> 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()) {