diff --git a/src/main/java/org/springframework/hateoas/ResourceSupport.java b/src/main/java/org/springframework/hateoas/ResourceSupport.java
index 36741f20..83e1a98c 100755
--- a/src/main/java/org/springframework/hateoas/ResourceSupport.java
+++ b/src/main/java/org/springframework/hateoas/ResourceSupport.java
@@ -55,7 +55,9 @@ public class ResourceSupport implements Identifiable {
* @param link
*/
public void add(Link link) {
+
Assert.notNull(link, "Link must not be null!");
+
this.links.add(link);
}
@@ -65,7 +67,9 @@ public class ResourceSupport implements Identifiable {
* @param links
*/
public void add(Iterable links) {
+
Assert.notNull(links, "Given links must not be null!");
+
links.forEach(this::add);
}
@@ -75,7 +79,9 @@ public class ResourceSupport implements Identifiable {
* @param links must not be {@literal null}.
*/
public void add(Link... links) {
+
Assert.notNull(links, "Given links must not be null!");
+
add(Arrays.asList(links));
}
diff --git a/src/main/java/org/springframework/hateoas/support/PropertyUtils.java b/src/main/java/org/springframework/hateoas/support/PropertyUtils.java
index 31f31dd6..f4cedc9a 100644
--- a/src/main/java/org/springframework/hateoas/support/PropertyUtils.java
+++ b/src/main/java/org/springframework/hateoas/support/PropertyUtils.java
@@ -87,10 +87,9 @@ public class PropertyUtils {
.collect(Collectors.toList());
}
- @SuppressWarnings("unchecked")
public static T createObjectFromProperties(Class clazz, Map properties) {
- Object obj = BeanUtils.instantiateClass(clazz);
+ T obj = BeanUtils.instantiateClass(clazz);
properties.forEach((key, value) -> {
Optional possibleProperty = Optional.ofNullable(BeanUtils.getPropertyDescriptor(clazz, key));
@@ -105,7 +104,7 @@ public class PropertyUtils {
});
});
- return (T) obj;
+ return obj;
}
/**
diff --git a/src/main/java/org/springframework/hateoas/uber/Jackson2UberModule.java b/src/main/java/org/springframework/hateoas/uber/Jackson2UberModule.java
index d93dd98f..523f977d 100644
--- a/src/main/java/org/springframework/hateoas/uber/Jackson2UberModule.java
+++ b/src/main/java/org/springframework/hateoas/uber/Jackson2UberModule.java
@@ -26,6 +26,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
@@ -59,12 +60,13 @@ import com.fasterxml.jackson.databind.type.TypeFactory;
* Jackson {@link SimpleModule} for {@literal UBER+JSON} serializers and deserializers.
*
* @author Greg Turnquist
+ * @author Jens Schauder
* @since 1.0
*/
public class Jackson2UberModule extends SimpleModule {
public Jackson2UberModule() {
-
+
super("uber-module", new Version(1, 0, 0, null, "org.springframework.hateoas", "spring-hateoas"));
setMixInAnnotation(ResourceSupport.class, ResourceSupportMixin.class);
@@ -81,7 +83,8 @@ public class Jackson2UberModule extends SimpleModule {
/**
* Custom {@link JsonSerializer} to render {@link ResourceSupport} into {@literal UBER+JSON}.
*/
- static class UberResourceSupportSerializer extends ContainerSerializer implements ContextualSerializer {
+ static class UberResourceSupportSerializer extends ContainerSerializer
+ implements ContextualSerializer {
private final BeanProperty property;
@@ -98,14 +101,14 @@ public class Jackson2UberModule extends SimpleModule {
@Override
public void serialize(ResourceSupport value, JsonGenerator gen, SerializerProvider provider) throws IOException {
- UberDocument doc = new UberDocument()
- .withUber(new Uber()
- .withVersion("1.0")
- .withData(extractLinksAndContent(value)));
+ UberDocument doc = new UberDocument() //
+ .withUber(new Uber() //
+ .withVersion("1.0") //
+ .withData(extractLinksAndContent(value)));
- provider
- .findValueSerializer(UberDocument.class, property)
- .serialize(doc, gen, provider);
+ provider //
+ .findValueSerializer(UberDocument.class, property) //
+ .serialize(doc, gen, provider);
}
@Override
@@ -129,7 +132,8 @@ public class Jackson2UberModule extends SimpleModule {
}
@Override
- public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
+ public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property)
+ throws JsonMappingException {
return new UberResourceSupportSerializer(property);
}
}
@@ -155,13 +159,13 @@ public class Jackson2UberModule extends SimpleModule {
public void serialize(Resource> value, JsonGenerator gen, SerializerProvider provider) throws IOException {
UberDocument doc = new UberDocument()
- .withUber(new Uber()
- .withVersion("1.0")
- .withData(extractLinksAndContent(value)));
+ .withUber(new Uber()
+ .withVersion("1.0")
+ .withData(extractLinksAndContent(value)));
- provider
- .findValueSerializer(UberDocument.class, property)
- .serialize(doc, gen, provider);
+ provider //
+ .findValueSerializer(UberDocument.class, property) //
+ .serialize(doc, gen, provider);
}
@Override
@@ -185,7 +189,8 @@ public class Jackson2UberModule extends SimpleModule {
}
@Override
- public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
+ public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property)
+ throws JsonMappingException {
return new UberResourceSerializer(property);
}
}
@@ -210,14 +215,14 @@ public class Jackson2UberModule extends SimpleModule {
@Override
public void serialize(Resources> value, JsonGenerator gen, SerializerProvider provider) throws IOException {
- UberDocument doc = new UberDocument()
- .withUber(new Uber()
- .withVersion("1.0")
- .withData(extractLinksAndContent(value)));
+ UberDocument doc = new UberDocument() //
+ .withUber(new Uber() //
+ .withVersion("1.0") //
+ .withData(extractLinksAndContent(value)));
- provider
- .findValueSerializer(UberDocument.class, property)
- .serialize(doc, gen, provider);
+ provider //
+ .findValueSerializer(UberDocument.class, property) //
+ .serialize(doc, gen, provider);
}
@Override
@@ -241,7 +246,8 @@ public class Jackson2UberModule extends SimpleModule {
}
@Override
- public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
+ public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property)
+ throws JsonMappingException {
return new UberResourcesSerializer(property);
}
}
@@ -249,7 +255,8 @@ public class Jackson2UberModule extends SimpleModule {
/**
* Custom {@link JsonSerializer} to render {@link PagedResources} into {@literal UBER+JSON}.
*/
- static class UberPagedResourcesSerializer extends ContainerSerializer> implements ContextualSerializer {
+ static class UberPagedResourcesSerializer extends ContainerSerializer>
+ implements ContextualSerializer {
private BeanProperty property;
@@ -266,14 +273,14 @@ public class Jackson2UberModule extends SimpleModule {
@Override
public void serialize(PagedResources> value, JsonGenerator gen, SerializerProvider provider) throws IOException {
- UberDocument doc = new UberDocument()
- .withUber(new Uber()
- .withVersion("1.0")
- .withData(extractLinksAndContent(value)));
+ UberDocument doc = new UberDocument() //
+ .withUber(new Uber() //
+ .withVersion("1.0") //
+ .withData(extractLinksAndContent(value)));
- provider
- .findValueSerializer(UberDocument.class, property)
- .serialize(doc, gen, provider);
+ provider //
+ .findValueSerializer(UberDocument.class, property) //
+ .serialize(doc, gen, provider);
}
@Override
@@ -297,7 +304,8 @@ public class Jackson2UberModule extends SimpleModule {
}
@Override
- public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
+ public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property)
+ throws JsonMappingException {
return new UberPagedResourcesSerializer(property);
}
}
@@ -320,7 +328,8 @@ public class Jackson2UberModule extends SimpleModule {
/**
* Custom {@link StdDeserializer} to deserialize {@link ResourceSupport}.
*/
- static class UberResourceSupportDeserializer extends ContainerDeserializerBase implements ContextualDeserializer {
+ static class UberResourceSupportDeserializer extends ContainerDeserializerBase
+ implements ContextualDeserializer {
private JavaType contentType;
@@ -333,33 +342,44 @@ public class Jackson2UberModule extends SimpleModule {
UberResourceSupportDeserializer() {
this(TypeFactory.defaultInstance().constructSimpleType(UberDocument.class, new JavaType[0]));
}
-
+
@Override
public ResourceSupport deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
UberDocument doc = p.getCodec().readValue(p, UberDocument.class);
+ List links = doc.getUber().getLinks();
- return doc.getUber().getData().stream()
- .filter(uberData -> !StringUtils.isEmpty(uberData.getName()))
- .findFirst()
- .map(uberData -> {
+ return doc.getUber().getData().stream() //
+ .filter(uberData -> !StringUtils.isEmpty(uberData.getName())) //
+ .findFirst() //
+ .map(uberData -> convertToResourceSupport(uberData, links)) //
+ .orElseGet(() -> {
- Map properties = uberData.getData().stream()
+ ResourceSupport resourceSupport = new ResourceSupport();
+ resourceSupport.add(links);
+
+ return resourceSupport;
+ });
+ }
+
+ @NotNull
+ private ResourceSupport convertToResourceSupport(UberData uberData, List links) {
+
+ List data = uberData.getData();
+ Map properties;
+
+ if (data == null) {
+ properties = new HashMap<>();
+ } else {
+ properties = data.stream() //
.collect(Collectors.toMap(UberData::getName, UberData::getValue));
+ }
+ ResourceSupport resourceSupport = (ResourceSupport) PropertyUtils
+ .createObjectFromProperties(this.getContentType().getRawClass(), properties);
- ResourceSupport obj = (ResourceSupport) PropertyUtils.createObjectFromProperties(this.getContentType().getRawClass(), properties);
+ resourceSupport.add(links);
- obj.add(doc.getUber().getLinks());
-
- return obj;
- })
- .orElseGet(() -> {
-
- ResourceSupport resourceSupport = new ResourceSupport();
- resourceSupport.add(doc.getUber().getLinks());
-
- return resourceSupport;
- });
+ return resourceSupport;
}
@Override
@@ -368,7 +388,8 @@ public class Jackson2UberModule extends SimpleModule {
}
@Override
- public JsonDeserializer> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
+ public JsonDeserializer> createContextual(DeserializationContext ctxt, BeanProperty property)
+ throws JsonMappingException {
if (property != null) {
JavaType vc = property.getType().getContentType();
@@ -379,7 +400,7 @@ public class Jackson2UberModule extends SimpleModule {
}
/**
- * Accesor for deserializer use for deserializing content values.
+ * Accessor for deserializer use for deserializing content values.
*/
@Override
public JsonDeserializer