diff --git a/pom.xml b/pom.xml
index 6dc3c5ac..3fca4d53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -559,12 +559,6 @@
${slf4j.version}
-
- com.google.code.findbugs
- jsr305
- ${jsr305.version}
-
-
org.slf4j
jcl-over-slf4j
diff --git a/src/main/java/org/springframework/hateoas/Affordance.java b/src/main/java/org/springframework/hateoas/Affordance.java
index d5de9a2e..90bf4305 100644
--- a/src/main/java/org/springframework/hateoas/Affordance.java
+++ b/src/main/java/org/springframework/hateoas/Affordance.java
@@ -27,6 +27,7 @@ import org.springframework.core.ResolvableType;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
@@ -74,6 +75,7 @@ public class Affordance {
* @param mediaType
* @return
*/
+ @Nullable
@SuppressWarnings("unchecked")
public T getAffordanceModel(MediaType mediaType) {
return (T) this.affordanceModels.get(mediaType);
diff --git a/src/main/java/org/springframework/hateoas/CollectionModel.java b/src/main/java/org/springframework/hateoas/CollectionModel.java
index b1c65386..652c23fe 100644
--- a/src/main/java/org/springframework/hateoas/CollectionModel.java
+++ b/src/main/java/org/springframework/hateoas/CollectionModel.java
@@ -21,6 +21,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -124,7 +125,7 @@ public class CollectionModel extends RepresentationModel>
* @see org.springframework.hateoas.ResourceSupport#equals(java.lang.Object)
*/
@Override
- public boolean equals(Object obj) {
+ public boolean equals(@Nullable Object obj) {
if (obj == this) {
return true;
diff --git a/src/main/java/org/springframework/hateoas/EntityModel.java b/src/main/java/org/springframework/hateoas/EntityModel.java
index 22b625a6..58f44c30 100644
--- a/src/main/java/org/springframework/hateoas/EntityModel.java
+++ b/src/main/java/org/springframework/hateoas/EntityModel.java
@@ -89,7 +89,7 @@ public class EntityModel extends RepresentationModel> {
* @see org.springframework.hateoas.ResourceSupport#equals(java.lang.Object)
*/
@Override
- public boolean equals(Object obj) {
+ public boolean equals(@Nullable Object obj) {
if (this == obj) {
return true;
diff --git a/src/main/java/org/springframework/hateoas/Link.java b/src/main/java/org/springframework/hateoas/Link.java
index 93d58cad..2e6b3c95 100755
--- a/src/main/java/org/springframework/hateoas/Link.java
+++ b/src/main/java/org/springframework/hateoas/Link.java
@@ -33,7 +33,6 @@ import java.util.regex.Pattern;
import org.springframework.core.ResolvableType;
import org.springframework.http.HttpMethod;
-import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -459,18 +458,17 @@ public class Link implements Serializable {
/**
* Factory method to easily create {@link Link} instances from RFC-5988 compatible {@link String} representations of a
- * link. Will return {@literal null} if input {@link String} is either empty or {@literal null}.
+ * link.
*
* @param element an RFC-5899 compatible representation of a link.
- * @throws IllegalArgumentException if a non-empty {@link String} was given that does not adhere to RFC-5899.
+ * @throws IllegalArgumentException if a {@link String} was given that does not adhere to RFC-5899.
* @throws IllegalArgumentException if no {@code rel} attribute could be found.
* @return
*/
- @Nullable
public static Link valueOf(String element) {
if (!StringUtils.hasText(element)) {
- return null;
+ throw new IllegalArgumentException(String.format("Given link header %s is not RFC5988 compliant!", element));
}
Matcher matcher = URI_AND_ATTRIBUTES_PATTERN.matcher(element);
diff --git a/src/main/java/org/springframework/hateoas/Links.java b/src/main/java/org/springframework/hateoas/Links.java
index 4b05d326..98f9656b 100644
--- a/src/main/java/org/springframework/hateoas/Links.java
+++ b/src/main/java/org/springframework/hateoas/Links.java
@@ -29,6 +29,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -95,7 +96,7 @@ public class Links implements Iterable {
* @param source a comma separated list of {@link Link} representations.
* @return the {@link Links} represented by the given {@link String}.
*/
- public static Links parse(String source) {
+ public static Links parse(@Nullable String source) {
if (!StringUtils.hasText(source)) {
return NONE;
@@ -416,13 +417,13 @@ public class Links implements Iterable {
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
- public boolean equals(Object arg0) {
+ public boolean equals(@Nullable Object obj) {
- if (!(arg0 instanceof Links)) {
+ if (!(obj instanceof Links)) {
return false;
}
- Links that = (Links) arg0;
+ Links that = (Links) obj;
return this.links.equals(that.links);
}
diff --git a/src/main/java/org/springframework/hateoas/PagedModel.java b/src/main/java/org/springframework/hateoas/PagedModel.java
index e66b08ef..2feedd22 100644
--- a/src/main/java/org/springframework/hateoas/PagedModel.java
+++ b/src/main/java/org/springframework/hateoas/PagedModel.java
@@ -135,7 +135,7 @@ public class PagedModel extends CollectionModel {
* @see org.springframework.hateoas.Resources#equals(java.lang.Object)
*/
@Override
- public boolean equals(Object obj) {
+ public boolean equals(@Nullable Object obj) {
if (this == obj) {
return true;
@@ -262,7 +262,7 @@ public class PagedModel extends CollectionModel {
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
- public boolean equals(Object obj) {
+ public boolean equals(@Nullable Object obj) {
if (this == obj) {
return true;
diff --git a/src/main/java/org/springframework/hateoas/RepresentationModel.java b/src/main/java/org/springframework/hateoas/RepresentationModel.java
index 097288e7..afa37818 100755
--- a/src/main/java/org/springframework/hateoas/RepresentationModel.java
+++ b/src/main/java/org/springframework/hateoas/RepresentationModel.java
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -238,7 +239,7 @@ public class RepresentationModel> {
*/
@Override
@SuppressWarnings("unchecked")
- public boolean equals(Object obj) {
+ public boolean equals(@Nullable Object obj) {
if (this == obj) {
return true;
diff --git a/src/main/java/org/springframework/hateoas/StringLinkRelation.java b/src/main/java/org/springframework/hateoas/StringLinkRelation.java
index ac018cfe..f4da3c00 100644
--- a/src/main/java/org/springframework/hateoas/StringLinkRelation.java
+++ b/src/main/java/org/springframework/hateoas/StringLinkRelation.java
@@ -25,6 +25,7 @@ import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.fasterxml.jackson.annotation.JsonCreator;
@@ -91,7 +92,7 @@ class StringLinkRelation implements LinkRelation, Serializable {
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
- public boolean equals(Object o) {
+ public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
diff --git a/src/main/java/org/springframework/hateoas/client/JsonPathLinkDiscoverer.java b/src/main/java/org/springframework/hateoas/client/JsonPathLinkDiscoverer.java
index fbbb0a15..15da13d3 100644
--- a/src/main/java/org/springframework/hateoas/client/JsonPathLinkDiscoverer.java
+++ b/src/main/java/org/springframework/hateoas/client/JsonPathLinkDiscoverer.java
@@ -15,6 +15,8 @@
*/
package org.springframework.hateoas.client;
+import net.minidev.json.JSONArray;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
@@ -25,11 +27,11 @@ import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import net.minidev.json.JSONArray;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.LinkRelation;
import org.springframework.hateoas.Links;
import org.springframework.http.MediaType;
+import org.springframework.lang.NonNull;
import org.springframework.util.Assert;
import com.jayway.jsonpath.InvalidPathException;
@@ -124,7 +126,7 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer {
* @see org.springframework.plugin.core.Plugin#supports(java.lang.Object)
*/
@Override
- public boolean supports(MediaType delimiter) {
+ public boolean supports(@NonNull MediaType delimiter) {
return this.mediaTypes.stream() //
.anyMatch(mediaType -> mediaType.isCompatibleWith(delimiter));
diff --git a/src/main/java/org/springframework/hateoas/client/Rels.java b/src/main/java/org/springframework/hateoas/client/Rels.java
index 1299df0b..cc50c137 100644
--- a/src/main/java/org/springframework/hateoas/client/Rels.java
+++ b/src/main/java/org/springframework/hateoas/client/Rels.java
@@ -57,11 +57,11 @@ class Rels {
/**
* Returns the link contained in the given representation of the given {@link MediaType}.
*
- * @param representation
- * @param mediaType
+ * @param representation will never be {@literal null}.
+ * @param mediaType will never be {@literal null}.
* @return
*/
- Optional findInResponse(@Nullable String representation, @Nullable MediaType mediaType);
+ Optional findInResponse(String representation, MediaType mediaType);
}
/**
diff --git a/src/main/java/org/springframework/hateoas/client/Traverson.java b/src/main/java/org/springframework/hateoas/client/Traverson.java
index d9011982..d0fd1989 100644
--- a/src/main/java/org/springframework/hateoas/client/Traverson.java
+++ b/src/main/java/org/springframework/hateoas/client/Traverson.java
@@ -207,6 +207,9 @@ public class Traverson {
*/
public class TraversalBuilder {
+ private static final String MEDIA_TYPE_HEADER_NOT_FOUND = "Response for request to %s did not expose a content type! Unable to identify links!";
+ private static final String LINK_NOT_FOUND = "Expected to find link with rel '%s' in response %s!";
+
private final List rels = new ArrayList<>();
private Map templateParameters = new HashMap<>();
private HttpHeaders headers = new HttpHeaders();
@@ -224,9 +227,9 @@ public class Traverson {
Assert.notNull(rels, "Rels must not be null!");
- for (String rel : rels) {
- this.rels.add(Hop.rel(rel));
- }
+ Arrays.stream(rels) //
+ .map(Hop::rel) //
+ .forEach(this.rels::add);
return this;
}
@@ -327,6 +330,7 @@ public class Traverson {
HttpEntity> requestEntity = prepareRequest(mergeHeaders(this.headers, uriAndHeaders.getHttpHeaders()));
String forObject = operations.exchange(uriAndHeaders.getUri(), GET, requestEntity, String.class).getBody();
+
return JsonPath.read(forObject, jsonPath);
}
@@ -359,7 +363,7 @@ public class Traverson {
}
/**
- * Returns the templated {@link Link} found for the last rel in the rels configured to follow.
+ * Returns the templated {@link Link} found for the last relation in the rels configured to follow.
*
* @return
* @since 0.17
@@ -370,28 +374,28 @@ public class Traverson {
private Link traverseToLink(boolean expandFinalUrl) {
- Assert.isTrue(this.rels.size() > 0, "At least one rel needs to be provided!");
+ Assert.isTrue(rels.size() > 0, "At least one rel needs to be provided!");
URIAndHeaders expandedFinalUriAndHeaders = traverseToExpandedFinalUrl();
UriStringAndHeaders finalUriAndHeaders = traverseToFinalUrl();
return new Link(expandFinalUrl ? expandedFinalUriAndHeaders.getUri().toString() : finalUriAndHeaders.getUri(),
- this.rels.get(this.rels.size() - 1).getRel());
+ rels.get(rels.size() - 1).getRel());
}
private UriStringAndHeaders traverseToFinalUrl() {
- UriStringAndHeaders uriAndHeaders = getAndFindLinkWithRel(baseUri.toString(), this.rels.iterator(),
- HttpHeaders.EMPTY);
+ UriStringAndHeaders uriAndHeaders = getAndFindLinkWithRel(baseUri.toString(), rels.iterator(), HttpHeaders.EMPTY);
+
return new UriStringAndHeaders(new UriTemplate(uriAndHeaders.getUri()).toString(),
uriAndHeaders.getHttpHeaders());
}
private URIAndHeaders traverseToExpandedFinalUrl() {
- UriStringAndHeaders uriAndHeaders = getAndFindLinkWithRel(baseUri.toString(), this.rels.iterator(),
- HttpHeaders.EMPTY);
- return new URIAndHeaders(new UriTemplate(uriAndHeaders.getUri()).expand(this.templateParameters),
+ UriStringAndHeaders uriAndHeaders = getAndFindLinkWithRel(baseUri.toString(), rels.iterator(), HttpHeaders.EMPTY);
+
+ return new URIAndHeaders(new UriTemplate(uriAndHeaders.getUri()).expand(templateParameters),
uriAndHeaders.getHttpHeaders());
}
@@ -402,28 +406,28 @@ public class Traverson {
}
HttpEntity> request = prepareRequest(mergeHeaders(this.headers, extraHeaders));
- UriTemplate template = new UriTemplate(uri);
+ URI target = new UriTemplate(uri).expand();
- ResponseEntity responseEntity = operations.exchange(template.expand(), GET, request, String.class);
+ ResponseEntity responseEntity = operations.exchange(target, GET, request, String.class);
MediaType contentType = responseEntity.getHeaders().getContentType();
+
+ if (contentType == null) {
+ throw new IllegalStateException(String.format(MEDIA_TYPE_HEADER_NOT_FOUND, target));
+ }
+
String responseBody = responseEntity.getBody();
Hop thisHop = rels.next();
Rel rel = Rels.getRelFor(thisHop.getRel(), discoverers);
- Link link = rel.findInResponse(responseBody, contentType) //
- .orElseThrow(() -> new IllegalStateException(
- String.format("Expected to find link with rel '%s' in response %s!", rel, responseBody)));
+ Link link = rel.findInResponse(responseBody == null ? "" : responseBody, contentType) //
+ .orElseThrow(() -> new IllegalStateException(String.format(LINK_NOT_FOUND, rel, responseBody)));
- /*
- * Don't expand if the parameters are empty
- */
- if (!thisHop.hasParameters()) {
- return getAndFindLinkWithRel(link.getHref(), rels, thisHop.getHeaders());
- } else {
- return getAndFindLinkWithRel(link.expand(thisHop.getMergedParameters(this.templateParameters)).getHref(), rels,
- thisHop.getHeaders());
- }
+ String linkTarget = thisHop.hasParameters() //
+ ? link.expand(thisHop.getMergedParameters(templateParameters)).getHref() //
+ : link.getHref();
+
+ return getAndFindLinkWithRel(linkTarget, rels, thisHop.getHeaders());
}
/**
diff --git a/src/main/java/org/springframework/hateoas/client/package-info.java b/src/main/java/org/springframework/hateoas/client/package-info.java
index 0df51da2..67c03370 100644
--- a/src/main/java/org/springframework/hateoas/client/package-info.java
+++ b/src/main/java/org/springframework/hateoas/client/package-info.java
@@ -1,7 +1,5 @@
/**
* Client side support.
*/
-@NonNullApi
+@org.springframework.lang.NonNullApi
package org.springframework.hateoas.client;
-
-import org.springframework.lang.NonNullApi;
\ No newline at end of file
diff --git a/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java
index 0652860b..ad388323 100644
--- a/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java
+++ b/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java
@@ -24,6 +24,7 @@ import org.springframework.context.support.ReloadableResourceBundleMessageSource
import org.springframework.hateoas.client.LinkDiscoverer;
import org.springframework.hateoas.client.LinkDiscoverers;
import org.springframework.hateoas.server.LinkRelationProvider;
+import org.springframework.hateoas.server.LinkRelationProvider.LookupContext;
import org.springframework.hateoas.server.core.AnnotationLinkRelationProvider;
import org.springframework.hateoas.server.core.DefaultLinkRelationProvider;
import org.springframework.hateoas.server.core.DelegatingLinkRelationProvider;
@@ -83,14 +84,15 @@ class HateoasConfiguration {
@Primary
@Bean
- DelegatingLinkRelationProvider _relProvider(PluginRegistry> relProviderPluginRegistry) {
+ DelegatingLinkRelationProvider _relProvider(
+ PluginRegistry relProviderPluginRegistry) {
return new DelegatingLinkRelationProvider(relProviderPluginRegistry);
}
@Bean
- PluginRegistryFactoryBean> relProviderPluginRegistry() {
+ PluginRegistryFactoryBean relProviderPluginRegistry() {
- PluginRegistryFactoryBean> factory = new PluginRegistryFactoryBean<>();
+ PluginRegistryFactoryBean factory = new PluginRegistryFactoryBean<>();
factory.setType(LinkRelationProvider.class);
factory.setExclusions(new Class[] { DelegatingLinkRelationProvider.class });
diff --git a/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java
index 55bf5910..b67a5c17 100644
--- a/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java
+++ b/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java
@@ -32,6 +32,7 @@ import org.springframework.http.codec.CodecConfigurer;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
+import org.springframework.lang.NonNull;
import org.springframework.util.MimeType;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.reactive.function.client.WebClient;
@@ -92,6 +93,7 @@ class WebFluxHateoasConfiguration {
* (non-Javadoc)
* @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization(java.lang.Object, java.lang.String)
*/
+ @NonNull
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
@@ -143,5 +145,4 @@ class WebFluxHateoasConfiguration {
configurer.registerDefaults(false);
}
}
-
}
diff --git a/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java
index 3bdc985b..af69f217 100644
--- a/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java
+++ b/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java
@@ -31,6 +31,7 @@ import org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2Http
import org.springframework.hateoas.server.mvc.UriComponentsContributor;
import org.springframework.hateoas.server.mvc.WebMvcLinkBuilderFactory;
import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.lang.NonNull;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@@ -107,6 +108,7 @@ class WebMvcHateoasConfiguration {
* (non-Javadoc)
* @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization(java.lang.Object, java.lang.String)
*/
+ @NonNull
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
diff --git a/src/main/java/org/springframework/hateoas/config/package-info.java b/src/main/java/org/springframework/hateoas/config/package-info.java
index a25e559c..ca44d9dc 100644
--- a/src/main/java/org/springframework/hateoas/config/package-info.java
+++ b/src/main/java/org/springframework/hateoas/config/package-info.java
@@ -1,7 +1,5 @@
/**
* Spring container configuration support.
*/
-@NonNullApi
+@org.springframework.lang.NonNullApi
package org.springframework.hateoas.config;
-
-import org.springframework.lang.NonNullApi;
\ No newline at end of file
diff --git a/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java b/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java
index 9245b4c2..b1d181f6 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2017 the original author or authors.
+ * Copyright 2017-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,6 +15,9 @@
*/
package org.springframework.hateoas.mediatype;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
import java.beans.FeatureDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
@@ -31,8 +34,6 @@ import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
import org.springframework.beans.BeanUtils;
import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.AnnotationUtils;
@@ -46,6 +47,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
* @author Greg Turnquist
+ * @author Oliver Drotbohm
*/
public class PropertyUtils {
@@ -67,43 +69,45 @@ public class PropertyUtils {
}
return getPropertyDescriptors(object.getClass()) //
- .collect(HashMap::new, //
- (hashMap, descriptor) -> {
- try {
- Method readMethod = descriptor.getReadMethod();
- ReflectionUtils.makeAccessible(readMethod);
- hashMap.put(descriptor.getName(), readMethod.invoke(object));
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- }, //
- HashMap::putAll);
+ .collect(HashMap::new, (hashMap, descriptor) -> {
+
+ try {
+
+ Method readMethod = descriptor.getReadMethod();
+ ReflectionUtils.makeAccessible(readMethod);
+ hashMap.put(descriptor.getName(), readMethod.invoke(object));
+
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+
+ }, HashMap::putAll);
}
public static List findPropertyNames(ResolvableType resolvableType) {
+ Class> type = resolvableType.getRawClass();
+
if (WebStack.WEBFLUX.isAvailable()) {
- if (Mono.class.equals(resolvableType.getRawClass()) || Flux.class.equals(resolvableType.getRawClass())) {
+ if (Mono.class.equals(type) || Flux.class.equals(type)) {
ResolvableType generic = resolvableType.getGeneric(0);
return findPropertyNames(generic);
}
}
- if (resolvableType.getRawClass() == null) {
+ if (type == null) {
return Collections.emptyList();
}
- if (resolvableType.getRawClass().equals(EntityModel.class)) {
- Class> genericEntityModelParameter = resolvableType.resolveGeneric(0);
-
- if (genericEntityModelParameter == null) {
- return Collections.emptyList();
- }
-
- return findPropertyNames(genericEntityModelParameter);
- } else {
- return findPropertyNames(resolvableType.getRawClass());
+ if (!type.equals(EntityModel.class)) {
+ return findPropertyNames(type);
}
+
+ Class> genericEntityModelParameter = resolvableType.resolveGeneric(0);
+
+ return genericEntityModelParameter == null //
+ ? Collections.emptyList() //
+ : findPropertyNames(genericEntityModelParameter);
}
public static List findPropertyNames(Class> clazz) {
@@ -118,16 +122,19 @@ public class PropertyUtils {
T obj = BeanUtils.instantiateClass(clazz);
properties.forEach((key, value) -> {
- Optional possibleProperty = Optional.ofNullable(BeanUtils.getPropertyDescriptor(clazz, key));
- possibleProperty.ifPresent(property -> {
- try {
- Method writeMethod = property.getWriteMethod();
- ReflectionUtils.makeAccessible(writeMethod);
- writeMethod.invoke(obj, value);
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- });
+ Optional.ofNullable(BeanUtils.getPropertyDescriptor(clazz, key)) //
+ .ifPresent(property -> {
+ try {
+
+ Method writeMethod = property.getWriteMethod();
+ ReflectionUtils.makeAccessible(writeMethod);
+ writeMethod.invoke(obj, value);
+
+ } catch (IllegalAccessException | InvocationTargetException e) {
+
+ throw new RuntimeException(e);
+ }
+ });
});
return obj;
@@ -135,7 +142,7 @@ public class PropertyUtils {
/**
* Take a {@link Class} and find all properties that are NOT to be ignored, and return them as a {@link Stream}.
- *
+ *
* @param clazz
* @return
*/
@@ -159,16 +166,14 @@ public class PropertyUtils {
Field descriptorField = ReflectionUtils.findField(clazz, descriptor.getName());
- if (descriptorField == null) {
- return false;
- }
-
- return toBeIgnoredByJackson(AnnotationUtils.getAnnotations(descriptorField));
+ return descriptorField == null //
+ ? false //
+ : toBeIgnoredByJackson(AnnotationUtils.getAnnotations(descriptorField));
}
/**
* Check if a given {@link PropertyDescriptor} has {@link JsonIgnore} on the getter.
- *
+ *
* @param descriptor
* @return
*/
@@ -178,26 +183,24 @@ public class PropertyUtils {
/**
* Scan a list of {@link Annotation}s for {@link JsonIgnore} annotations.
- *
+ *
* @param annotations
* @return
*/
private static boolean toBeIgnoredByJackson(@Nullable Annotation[] annotations) {
- if (annotations == null) {
- return false;
- }
-
- return Arrays.stream(annotations) //
- .filter(annotation -> annotation.annotationType().equals(JsonIgnore.class)) //
- .findFirst() //
- .map(annotation -> (Boolean) AnnotationUtils.getAnnotationAttributes(annotation).get("value")) //
- .orElse(false);
+ return annotations == null //
+ ? false
+ : Arrays.stream(annotations) //
+ .filter(annotation -> annotation.annotationType().equals(JsonIgnore.class)) //
+ .findFirst() //
+ .map(annotation -> (Boolean) AnnotationUtils.getAnnotationAttributes(annotation).get("value")) //
+ .orElse(false);
}
/**
* Check if a field name is to be ignored due to {@link JsonIgnoreProperties}.
- *
+ *
* @param clazz
* @param field
* @return
@@ -206,15 +209,12 @@ public class PropertyUtils {
Annotation[] annotations = AnnotationUtils.getAnnotations(clazz);
- if (annotations == null) {
- return false;
- }
-
- return Arrays.stream(annotations) //
- .filter(annotation -> annotation.annotationType().equals(JsonIgnoreProperties.class)) //
- .map(annotation -> (String[]) AnnotationUtils.getAnnotationAttributes(annotation).get("value")) //
- .flatMap(Arrays::stream) //
- .anyMatch(propertyName -> propertyName.equalsIgnoreCase(field));
+ return annotations == null //
+ ? false //
+ : Arrays.stream(annotations) //
+ .filter(annotation -> annotation.annotationType().equals(JsonIgnoreProperties.class)) //
+ .map(annotation -> (String[]) AnnotationUtils.getAnnotationAttributes(annotation).get("value")) //
+ .flatMap(Arrays::stream) //
+ .anyMatch(propertyName -> propertyName.equalsIgnoreCase(field));
}
-
}
diff --git a/src/main/java/org/springframework/hateoas/mediatype/alps/package-info.java b/src/main/java/org/springframework/hateoas/mediatype/alps/package-info.java
index 07e85bf0..8b93b04d 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/alps/package-info.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/alps/package-info.java
@@ -1,9 +1,7 @@
/**
* Value objects to build ALPS metadata.
- *
+ *
* @see https://alps.io
*/
-@NonNullApi
+@org.springframework.lang.NonNullApi
package org.springframework.hateoas.mediatype.alps;
-
-import org.springframework.lang.NonNullApi;
\ No newline at end of file
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java
index 31b7ca79..94d70155 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java
@@ -43,28 +43,28 @@ import com.fasterxml.jackson.annotation.JsonProperty;
class CollectionJson {
private String version;
- private String href;
+ private @Nullable String href;
private @JsonInclude(Include.NON_EMPTY) Links links;
private @JsonInclude(Include.NON_EMPTY) List> items;
private @JsonInclude(Include.NON_EMPTY) List queries;
- private @JsonInclude(Include.NON_NULL) CollectionJsonTemplate template;
- private @JsonInclude(Include.NON_NULL) CollectionJsonError error;
+ private @JsonInclude(Include.NON_NULL) @Nullable CollectionJsonTemplate template;
+ private @JsonInclude(Include.NON_NULL) @Nullable CollectionJsonError error;
@JsonCreator
CollectionJson(@JsonProperty("version") String version, //
- @JsonProperty("href") @Nullable String href, //
- @JsonProperty("links") @Nullable Links links, //
- @JsonProperty("items") @Nullable List> items, //
- @JsonProperty("queries") @Nullable List queries, //
- @JsonProperty("template") @Nullable CollectionJsonTemplate template, //
- @JsonProperty("error") @Nullable CollectionJsonError error) {
+ @JsonProperty("href") @Nullable String href, //
+ @JsonProperty("links") @Nullable Links links, //
+ @JsonProperty("items") @Nullable List> items, //
+ @JsonProperty("queries") @Nullable List queries, //
+ @JsonProperty("template") @Nullable CollectionJsonTemplate template, //
+ @JsonProperty("error") @Nullable CollectionJsonError error) {
this.version = version;
this.href = href;
this.links = links == null ? Links.NONE : links;
this.items = items == null ? Collections.emptyList() : items;
- this.queries = queries;
+ this.queries = queries == null ? Collections.emptyList() : queries;
this.template = template;
this.error = error;
}
@@ -92,6 +92,8 @@ class CollectionJson {
CollectionJson withOwnSelfLink() {
+ String href = this.href;
+
if (href == null) {
return this;
}
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java
index 7fd95ab7..684300e6 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java
@@ -35,16 +35,17 @@ import com.fasterxml.jackson.annotation.JsonProperty;
class CollectionJsonData {
@JsonInclude(Include.NON_NULL) //
- private String name;
+ private @Nullable String name;
@JsonInclude(Include.NON_NULL) //
- private Object value;
+ private @Nullable Object value;
@JsonInclude(Include.NON_NULL) //
- private String prompt;
+ private @Nullable String prompt;
@JsonCreator
- CollectionJsonData(@JsonProperty("name") @Nullable String name, @JsonProperty("value") @Nullable Object value,
+ CollectionJsonData(@JsonProperty("name") @Nullable String name, //
+ @JsonProperty("value") @Nullable Object value, //
@JsonProperty("prompt") @Nullable String prompt) {
this.name = name;
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java
index 171451b8..caa4f982 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java
@@ -49,10 +49,10 @@ import com.fasterxml.jackson.databind.JavaType;
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
class CollectionJsonItem {
- private String href;
+ private @Nullable String href;
private List data;
private @JsonInclude(Include.NON_EMPTY) Links links;
- private @Getter(onMethod = @__({ @JsonIgnore }), value = AccessLevel.PRIVATE) T rawData;
+ private @Nullable @Getter(onMethod = @__({ @JsonIgnore }), value = AccessLevel.PRIVATE) T rawData;
@JsonCreator
CollectionJsonItem(@JsonProperty("href") @Nullable String href, //
@@ -60,7 +60,7 @@ class CollectionJsonItem {
@JsonProperty("links") @Nullable Links links) {
this.href = href;
- this.data = data;
+ this.data = data == null ? Collections.emptyList() : data;
this.links = links == null ? Links.NONE : links;
this.rawData = null;
}
@@ -81,7 +81,7 @@ class CollectionJsonItem {
*/
public List getData() {
- if (this.data != null) {
+ if (!this.data.isEmpty()) {
return this.data;
}
@@ -89,8 +89,10 @@ class CollectionJsonItem {
return Collections.singletonList(new CollectionJsonData().withValue(this.rawData));
}
- return PropertyUtils.findProperties(this.rawData).entrySet().stream()
- .map(entry -> new CollectionJsonData().withName(entry.getKey()).withValue(entry.getValue()))
+ return PropertyUtils.findProperties(this.rawData).entrySet().stream() //
+ .map(entry -> new CollectionJsonData() //
+ .withName(entry.getKey()) //
+ .withValue(entry.getValue())) //
.collect(Collectors.toList());
}
@@ -103,7 +105,7 @@ class CollectionJsonItem {
@Nullable
public Object toRawData(JavaType javaType) {
- if (this.data == null) {
+ if (this.data.isEmpty()) {
return null;
}
@@ -125,6 +127,8 @@ class CollectionJsonItem {
public CollectionJsonItem withOwnSelfLink() {
+ String href = this.href;
+
if (href == null) {
return this;
}
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonMediaTypeConfiguration.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonMediaTypeConfiguration.java
index 81e16e0b..ae487481 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonMediaTypeConfiguration.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonMediaTypeConfiguration.java
@@ -19,10 +19,11 @@ import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType;
import org.springframework.hateoas.client.LinkDiscoverer;
+import org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType;
import org.springframework.hateoas.config.HypermediaMappingInformation;
import org.springframework.http.MediaType;
+import org.springframework.lang.NonNull;
import com.fasterxml.jackson.databind.Module;
@@ -53,6 +54,7 @@ class CollectionJsonMediaTypeConfiguration implements HypermediaMappingInformati
* (non-Javadoc)
* @see org.springframework.hateoas.config.HypermediaMappingInformation#getJacksonModule()
*/
+ @NonNull
@Override
public Module getJacksonModule() {
return new Jackson2CollectionJsonModule();
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/Jackson2CollectionJsonModule.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/Jackson2CollectionJsonModule.java
index 8f864c1a..8113b099 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/Jackson2CollectionJsonModule.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/Jackson2CollectionJsonModule.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015-2019 the original author or authors.
+stand bisher hauptsächlich darin, dass * Copyright 2015-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,11 +16,9 @@
package org.springframework.hateoas.mediatype.collectionjson;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -105,8 +103,8 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* (non-Javadoc)
* @see com.fasterxml.jackson.databind.ser.std.StdSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
*/
-
@Override
+ @SuppressWarnings("null")
public void serialize(Links links, JsonGenerator jgen, SerializerProvider provider) throws IOException {
JavaType type = provider.getTypeFactory().constructCollectionType(List.class, Link.class);
@@ -120,6 +118,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.JsonSerializer#isEmpty(com.fasterxml.jackson.databind.SerializerProvider, java.lang.Object)
*/
@Override
+ @SuppressWarnings("null")
public boolean isEmpty(SerializerProvider provider, Links value) {
return value.isEmpty();
}
@@ -148,6 +147,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.ContainerSerializer#hasSingleElement(java.lang.Object)
*/
@Override
+ @SuppressWarnings("null")
public boolean hasSingleElement(Links value) {
return false;
}
@@ -158,6 +158,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
*/
@Override
@Nullable
+ @SuppressWarnings("null")
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -180,7 +181,12 @@ class Jackson2CollectionJsonModule extends SimpleModule {
this.property = property;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.std.StdSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
+ */
@Override
+ @SuppressWarnings("null")
public void serialize(RepresentationModel> value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
@@ -207,31 +213,54 @@ class Jackson2CollectionJsonModule extends SimpleModule {
provider.findValueSerializer(CollectionJsonDocument.class, property).serialize(doc, jgen, provider);
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContextualSerializer#createContextual(com.fasterxml.jackson.databind.SerializerProvider, com.fasterxml.jackson.databind.BeanProperty)
+ */
@Override
+ @SuppressWarnings("null")
public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property)
throws JsonMappingException {
return new CollectionJsonResourceSupportSerializer(property);
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentType()
+ */
@Override
@Nullable
public JavaType getContentType() {
return null;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentSerializer()
+ */
@Override
@Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#hasSingleElement(java.lang.Object)
+ */
@Override
+ @SuppressWarnings("null")
public boolean hasSingleElement(RepresentationModel> value) {
return true;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#_withValueTypeSerializer(com.fasterxml.jackson.databind.jsontype.TypeSerializer)
+ */
@Override
@Nullable
+ @SuppressWarnings("null")
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -254,7 +283,12 @@ class Jackson2CollectionJsonModule extends SimpleModule {
this.property = property;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.std.StdSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
+ */
@Override
+ @SuppressWarnings("null")
public void serialize(EntityModel> value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
String href = value.getRequiredLink(IanaLinkRelations.SELF).getHref();
@@ -277,31 +311,54 @@ class Jackson2CollectionJsonModule extends SimpleModule {
.serialize(doc, jgen, provider);
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContextualSerializer#createContextual(com.fasterxml.jackson.databind.SerializerProvider, com.fasterxml.jackson.databind.BeanProperty)
+ */
@Override
+ @SuppressWarnings("null")
public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property)
throws JsonMappingException {
return new CollectionJsonResourceSerializer(property);
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentType()
+ */
@Override
@Nullable
public JavaType getContentType() {
return null;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentSerializer()
+ */
@Override
@Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#hasSingleElement(java.lang.Object)
+ */
@Override
+ @SuppressWarnings("null")
public boolean hasSingleElement(EntityModel> value) {
return true;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#_withValueTypeSerializer(com.fasterxml.jackson.databind.jsontype.TypeSerializer)
+ */
@Override
@Nullable
+ @SuppressWarnings("null")
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -320,6 +377,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.std.StdSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
*/
@Override
+ @SuppressWarnings("null")
public void serialize(CollectionModel> value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
@@ -362,6 +420,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.JsonSerializer#isEmpty(com.fasterxml.jackson.databind.SerializerProvider, java.lang.Object)
*/
@Override
+ @SuppressWarnings("null")
public boolean isEmpty(SerializerProvider provider, CollectionModel> value) {
return value.getContent().isEmpty();
}
@@ -371,6 +430,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.ContainerSerializer#hasSingleElement(java.lang.Object)
*/
@Override
+ @SuppressWarnings("null")
public boolean hasSingleElement(CollectionModel> value) {
return value.getContent().size() == 1;
}
@@ -381,6 +441,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
*/
@Override
@Nullable
+ @SuppressWarnings("null")
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -403,7 +464,12 @@ class Jackson2CollectionJsonModule extends SimpleModule {
this.property = property;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.std.StdSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
+ */
@Override
+ @SuppressWarnings("null")
public void serialize(PagedModel> value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
CollectionJson> collectionJson = new CollectionJson<>() //
@@ -419,36 +485,64 @@ class Jackson2CollectionJsonModule extends SimpleModule {
provider.findValueSerializer(CollectionJsonDocument.class, property).serialize(doc, jgen, provider);
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContextualSerializer#createContextual(com.fasterxml.jackson.databind.SerializerProvider, com.fasterxml.jackson.databind.BeanProperty)
+ */
@Override
+ @SuppressWarnings("null")
public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property)
throws JsonMappingException {
return new CollectionJsonPagedResourcesSerializer(property);
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentType()
+ */
@Override
@Nullable
public JavaType getContentType() {
return null;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentSerializer()
+ */
@Override
@Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.JsonSerializer#isEmpty(java.lang.Object)
+ */
@Override
+ @SuppressWarnings("null")
public boolean isEmpty(PagedModel> value) {
return value.getContent().size() == 0;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#hasSingleElement(java.lang.Object)
+ */
@Override
+ @SuppressWarnings("null")
public boolean hasSingleElement(PagedModel> value) {
return value.getContent().size() == 1;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#_withValueTypeSerializer(com.fasterxml.jackson.databind.jsontype.TypeSerializer)
+ */
@Override
@Nullable
+ @SuppressWarnings("null")
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -487,6 +581,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.JsonDeserializer#deserialize(com.fasterxml.jackson.core.JsonParser, com.fasterxml.jackson.databind.DeserializationContext)
*/
@Override
+ @SuppressWarnings("null")
public Links deserialize(JsonParser jp, DeserializationContext ctx) throws IOException {
JavaType type = ctx.getTypeFactory().constructCollectionLikeType(List.class, Link.class);
@@ -537,6 +632,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
*/
@Override
@Nullable
+ @SuppressWarnings("null")
public RepresentationModel> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
TypeFactory typeFactory = ctxt.getTypeFactory();
@@ -561,7 +657,6 @@ class Jackson2CollectionJsonModule extends SimpleModule {
(left, right) -> right);
CollectionJsonItem> firstItem = items.get(0).withOwnSelfLink();
-
RepresentationModel> resource = (RepresentationModel>) firstItem.toRawData(this.contentType);
if (resource != null) {
@@ -571,9 +666,11 @@ class Jackson2CollectionJsonModule extends SimpleModule {
return resource;
}
- if (withOwnSelfLink.getTemplate() != null) {
+ CollectionJsonTemplate template = withOwnSelfLink.getTemplate();
- Map properties = withOwnSelfLink.getTemplate().getData().stream()
+ if (template != null) {
+
+ Map properties = template.getData().stream()
.collect(Collectors.toMap(CollectionJsonData::getName, CollectionJsonData::getValue));
RepresentationModel> resourceSupport = (RepresentationModel>) PropertyUtils
@@ -582,20 +679,24 @@ class Jackson2CollectionJsonModule extends SimpleModule {
return resourceSupport.add(withOwnSelfLink.getLinks());
} else {
-
return new RepresentationModel<>().add(withOwnSelfLink.getLinks());
}
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.deser.ContextualDeserializer#createContextual(com.fasterxml.jackson.databind.DeserializationContext, com.fasterxml.jackson.databind.BeanProperty)
+ */
@Override
- public JsonDeserializer> createContextual(DeserializationContext ctxt, BeanProperty property)
+ @SuppressWarnings("null")
+ public JsonDeserializer> createContextual(DeserializationContext context, @Nullable BeanProperty property)
throws JsonMappingException {
- if (property != null) {
- return new CollectionJsonResourceSupportDeserializer(property.getType().getContentType());
- } else {
- return new CollectionJsonResourceSupportDeserializer(ctxt.getContextualType());
- }
+ JavaType type = property == null //
+ ? context.getContextualType() //
+ : property.getType().getContentType();
+
+ return new CollectionJsonResourceSupportDeserializer(type);
}
}
@@ -616,18 +717,31 @@ class Jackson2CollectionJsonModule extends SimpleModule {
this.contentType = contentType;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.deser.std.ContainerDeserializerBase#getContentType()
+ */
@Override
public JavaType getContentType() {
return this.contentType;
}
+ /*
+ * (non-Javadoc)
+ * @see com.fasterxml.jackson.databind.deser.std.ContainerDeserializerBase#getContentDeserializer()
+ */
@Override
@Nullable
public JsonDeserializer