diff --git a/pom.xml b/pom.xml
index 1aa14183..4803f720 100644
--- a/pom.xml
+++ b/pom.xml
@@ -77,6 +77,7 @@
2.9.8
spring.hateoas
2.2.0
+ 3.0.2
2.2.1
Californium-SR4
1.7.25
@@ -558,6 +559,12 @@
${slf4j.version}
+
+ com.google.code.findbugs
+ jsr305
+ ${jsr305.version}
+
+
org.slf4j
jcl-over-slf4j
diff --git a/src/main/java/org/springframework/hateoas/EntityModel.java b/src/main/java/org/springframework/hateoas/EntityModel.java
index 8b6408ed..22b625a6 100644
--- a/src/main/java/org/springframework/hateoas/EntityModel.java
+++ b/src/main/java/org/springframework/hateoas/EntityModel.java
@@ -18,6 +18,7 @@ package org.springframework.hateoas;
import java.util.Arrays;
import java.util.Collection;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
@@ -55,7 +56,7 @@ public class EntityModel extends RepresentationModel> {
* @param content must not be {@literal null}.
* @param links the links to add to the {@link EntityModel}.
*/
- public EntityModel(T content, Iterable links) {
+ public EntityModel(@Nullable T content, Iterable links) {
Assert.notNull(content, "Content must not be null!");
Assert.isTrue(!(content instanceof Collection), "Content must not be a collection! Use Resources instead!");
@@ -69,6 +70,7 @@ public class EntityModel extends RepresentationModel> {
* @return the content
*/
@JsonUnwrapped
+ @Nullable
public T getContent() {
return content;
}
diff --git a/src/main/java/org/springframework/hateoas/Link.java b/src/main/java/org/springframework/hateoas/Link.java
index 4c94fd85..04353307 100755
--- a/src/main/java/org/springframework/hateoas/Link.java
+++ b/src/main/java/org/springframework/hateoas/Link.java
@@ -33,6 +33,7 @@ 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;
@@ -238,8 +239,14 @@ public class Link implements Serializable {
*/
public Link andAffordance(HttpMethod httpMethod, ResolvableType inputType, List queryMethodParameters,
ResolvableType outputType) {
- return andAffordance(httpMethod.toString().toLowerCase() + inputType.resolve().getSimpleName(), httpMethod,
- inputType, queryMethodParameters, outputType);
+
+ String name = httpMethod.toString().toLowerCase();
+
+ if (inputType.resolve() != null) {
+ name += inputType.resolve().getSimpleName();
+ }
+
+ return andAffordance(name, httpMethod, inputType, queryMethodParameters, outputType);
}
/**
@@ -458,6 +465,7 @@ public class Link implements Serializable {
* @throws IllegalArgumentException if no {@code rel} attribute could be found.
* @return
*/
+ @Nullable
public static Link valueOf(String element) {
if (!StringUtils.hasText(element)) {
diff --git a/src/main/java/org/springframework/hateoas/PagedModel.java b/src/main/java/org/springframework/hateoas/PagedModel.java
index 68ecf6f4..e66b08ef 100644
--- a/src/main/java/org/springframework/hateoas/PagedModel.java
+++ b/src/main/java/org/springframework/hateoas/PagedModel.java
@@ -20,6 +20,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Optional;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -51,7 +52,7 @@ public class PagedModel extends CollectionModel {
* @param metadata
* @param links
*/
- public PagedModel(Collection content, PageMetadata metadata, Link... links) {
+ public PagedModel(Collection content, @Nullable PageMetadata metadata, Link... links) {
this(content, metadata, Arrays.asList(links));
}
@@ -62,7 +63,7 @@ public class PagedModel extends CollectionModel {
* @param metadata
* @param links
*/
- public PagedModel(Collection content, PageMetadata metadata, Iterable links) {
+ public PagedModel(Collection content, @Nullable PageMetadata metadata, Iterable links) {
super(content, links);
@@ -75,6 +76,7 @@ public class PagedModel extends CollectionModel {
* @return the metadata
*/
@JsonProperty("page")
+ @Nullable
public PageMetadata getMetadata() {
return metadata;
}
diff --git a/src/main/java/org/springframework/hateoas/StringLinkRelation.java b/src/main/java/org/springframework/hateoas/StringLinkRelation.java
index ac018cfe..462cf782 100644
--- a/src/main/java/org/springframework/hateoas/StringLinkRelation.java
+++ b/src/main/java/org/springframework/hateoas/StringLinkRelation.java
@@ -15,9 +15,7 @@
*/
package org.springframework.hateoas;
-import lombok.AccessLevel;
import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
import lombok.Value;
import java.io.Serializable;
@@ -36,7 +34,6 @@ import com.fasterxml.jackson.annotation.JsonValue;
* @author Oliver Drotbohm
*/
@Value
-@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
class StringLinkRelation implements LinkRelation, Serializable {
private static final long serialVersionUID = -3904935345545567957L;
@@ -44,6 +41,13 @@ class StringLinkRelation implements LinkRelation, Serializable {
@NonNull String relation;
+ private StringLinkRelation(String relation) {
+
+ Assert.notNull(relation, "relation must not be null!");
+
+ this.relation = relation;
+ }
+
/**
* Returns a (potentially cached) {@link LinkRelation} for the given value.
*
diff --git a/src/main/java/org/springframework/hateoas/UriTemplate.java b/src/main/java/org/springframework/hateoas/UriTemplate.java
index 577067c6..26022d9e 100644
--- a/src/main/java/org/springframework/hateoas/UriTemplate.java
+++ b/src/main/java/org/springframework/hateoas/UriTemplate.java
@@ -27,6 +27,7 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.springframework.hateoas.TemplateVariable.VariableType;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.util.UriComponents;
@@ -285,7 +286,7 @@ public class UriTemplate implements Iterable, Serializable {
* @param variable must not be {@literal null}.
* @param value can be {@literal null}.
*/
- private static void appendToBuilder(UriComponentsBuilder builder, TemplateVariable variable, Object value) {
+ private static void appendToBuilder(UriComponentsBuilder builder, TemplateVariable variable, @Nullable Object value) {
if (value == null) {
diff --git a/src/main/java/org/springframework/hateoas/client/Rels.java b/src/main/java/org/springframework/hateoas/client/Rels.java
index f1794e7a..1299df0b 100644
--- a/src/main/java/org/springframework/hateoas/client/Rels.java
+++ b/src/main/java/org/springframework/hateoas/client/Rels.java
@@ -19,6 +19,7 @@ import java.util.Optional;
import org.springframework.hateoas.Link;
import org.springframework.http.MediaType;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.jayway.jsonpath.JsonPath;
@@ -60,7 +61,7 @@ class Rels {
* @param mediaType
* @return
*/
- Optional findInResponse(String representation, MediaType mediaType);
+ Optional findInResponse(@Nullable String representation, @Nullable MediaType mediaType);
}
/**
@@ -141,7 +142,7 @@ class Rels {
* @see org.springframework.hateoas.client.Rels.Rel#findInResponse(java.lang.String, org.springframework.http.MediaType)
*/
@Override
- public Optional findInResponse(String representation, MediaType mediaType) {
+ public Optional findInResponse(@Nullable String representation, @Nullable MediaType mediaType) {
return Optional.of(new Link(JsonPath.read(representation, jsonPath).toString(), rel));
}
}
diff --git a/src/main/java/org/springframework/hateoas/client/Traverson.java b/src/main/java/org/springframework/hateoas/client/Traverson.java
index ad7ed7f6..db8cb907 100644
--- a/src/main/java/org/springframework/hateoas/client/Traverson.java
+++ b/src/main/java/org/springframework/hateoas/client/Traverson.java
@@ -40,6 +40,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.lang.Nullable;
import org.springframework.plugin.core.PluginRegistry;
import org.springframework.util.Assert;
import org.springframework.web.client.RestOperations;
@@ -139,7 +140,7 @@ public class Traverson {
* @param operations
* @return
*/
- public Traverson setRestOperations(RestOperations operations) {
+ public Traverson setRestOperations(@Nullable RestOperations operations) {
this.operations = operations == null //
? createDefaultTemplate(this.mediaTypes) //
@@ -155,7 +156,7 @@ public class Traverson {
* @param discoverer can be {@literal null}.
* @return
*/
- public Traverson setLinkDiscoverers(List extends LinkDiscoverer> discoverer) {
+ public Traverson setLinkDiscoverers(@Nullable List extends LinkDiscoverer> discoverer) {
List extends LinkDiscoverer> defaultedDiscoverers = discoverer == null //
? DEFAULTS.getLinkDiscoverers(mediaTypes) //
@@ -282,6 +283,7 @@ public class Traverson {
* @param type must not be {@literal null}.
* @return
*/
+ @Nullable
public T toObject(Class type) {
Assert.notNull(type, "Target type must not be null!");
@@ -299,6 +301,7 @@ public class Traverson {
* @param type must not be {@literal null}.
* @return
*/
+ @Nullable
public T toObject(ParameterizedTypeReference type) {
Assert.notNull(type, "Target type must not be null!");
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 50537d2d..0df51da2 100644
--- a/src/main/java/org/springframework/hateoas/client/package-info.java
+++ b/src/main/java/org/springframework/hateoas/client/package-info.java
@@ -1,5 +1,7 @@
/**
* Client side support.
*/
+@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/HypermediaConfigurationImportSelector.java b/src/main/java/org/springframework/hateoas/config/HypermediaConfigurationImportSelector.java
index a19c1852..259eb887 100644
--- a/src/main/java/org/springframework/hateoas/config/HypermediaConfigurationImportSelector.java
+++ b/src/main/java/org/springframework/hateoas/config/HypermediaConfigurationImportSelector.java
@@ -17,6 +17,7 @@ package org.springframework.hateoas.config;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Map;
import java.util.stream.Collectors;
@@ -43,9 +44,10 @@ class HypermediaConfigurationImportSelector implements ImportSelector {
Map attributes = metadata.getAnnotationAttributes(EnableHypermediaSupport.class.getName());
- Collection types = Arrays.stream((HypermediaType[]) attributes.get("type")) //
- .flatMap(it -> it.getMediaTypes().stream()) //
- .collect(Collectors.toList());
+ Collection types = attributes == null ? Collections.emptyList()
+ : Arrays.stream((HypermediaType[]) attributes.get("type")) //
+ .flatMap(it -> it.getMediaTypes().stream()) //
+ .collect(Collectors.toList());
Collection configurationProviders = SpringFactoriesLoader.loadFactories(
MediaTypeConfigurationProvider.class, HypermediaConfigurationImportSelector.class.getClassLoader());
diff --git a/src/main/java/org/springframework/hateoas/config/HypermediaMappingInformation.java b/src/main/java/org/springframework/hateoas/config/HypermediaMappingInformation.java
index 830774c5..a5281239 100644
--- a/src/main/java/org/springframework/hateoas/config/HypermediaMappingInformation.java
+++ b/src/main/java/org/springframework/hateoas/config/HypermediaMappingInformation.java
@@ -19,6 +19,7 @@ import java.util.List;
import java.util.Optional;
import org.springframework.http.MediaType;
+import org.springframework.lang.Nullable;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.Module;
@@ -63,6 +64,7 @@ public interface HypermediaMappingInformation {
* @return
* @see #configureObjectMapper(ObjectMapper)
*/
+ @Nullable
default Module getJacksonModule() {
return null;
}
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 fef5e93f..a25e559c 100644
--- a/src/main/java/org/springframework/hateoas/config/package-info.java
+++ b/src/main/java/org/springframework/hateoas/config/package-info.java
@@ -1,5 +1,7 @@
/**
* Spring container configuration support.
*/
+@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 7746dfd5..5ac33148 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/PropertyUtils.java
@@ -22,6 +22,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -37,6 +38,7 @@ import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.support.WebStack;
+import org.springframework.lang.Nullable;
import org.springframework.util.ReflectionUtils;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -54,7 +56,11 @@ public class PropertyUtils {
FIELDS_TO_IGNORE.add("links");
}
- public static Map findProperties(Object object) {
+ public static Map findProperties(@Nullable Object object) {
+
+ if (object == null) {
+ return Collections.emptyMap();
+ }
if (object.getClass().equals(EntityModel.class)) {
return findProperties(((EntityModel>) object).getContent());
@@ -83,8 +89,18 @@ public class PropertyUtils {
}
}
+ if (resolvableType.getRawClass() == null) {
+ return Collections.emptyList();
+ }
+
if (resolvableType.getRawClass().equals(EntityModel.class)) {
- return findPropertyNames(resolvableType.resolveGeneric(0));
+ Class> genericEntityModelParameter = resolvableType.resolveGeneric(0);
+
+ if (genericEntityModelParameter == null) {
+ return Collections.emptyList();
+ }
+
+ return findPropertyNames(genericEntityModelParameter);
} else {
return findPropertyNames(resolvableType.getRawClass());
}
@@ -143,6 +159,10 @@ public class PropertyUtils {
Field descriptorField = ReflectionUtils.findField(clazz, descriptor.getName());
+ if (descriptorField == null) {
+ return false;
+ }
+
return toBeIgnoredByJackson(AnnotationUtils.getAnnotations(descriptorField));
}
@@ -162,7 +182,7 @@ public class PropertyUtils {
* @param annotations
* @return
*/
- private static boolean toBeIgnoredByJackson(Annotation[] annotations) {
+ private static boolean toBeIgnoredByJackson(@Nullable Annotation[] annotations) {
if (annotations != null) {
for (Annotation annotation : annotations) {
@@ -184,12 +204,16 @@ public class PropertyUtils {
*/
private static boolean toBeIgnoredByJackson(Class> clazz, String field) {
- for (Annotation annotation : AnnotationUtils.getAnnotations(clazz)) {
- if (annotation.annotationType().equals(JsonIgnoreProperties.class)) {
- String[] namesOfPropertiesToIgnore = (String[]) AnnotationUtils.getAnnotationAttributes(annotation).get("value");
- for (String propertyToIgnore : namesOfPropertiesToIgnore) {
- if (propertyToIgnore.equalsIgnoreCase(field)) {
- return true;
+ Annotation[] annotations = AnnotationUtils.getAnnotations(clazz);
+
+ if (annotations != null) {
+ for (Annotation annotation : annotations) {
+ if (annotation.annotationType().equals(JsonIgnoreProperties.class)) {
+ String[] namesOfPropertiesToIgnore = (String[]) AnnotationUtils.getAnnotationAttributes(annotation).get("value");
+ for (String propertyToIgnore : namesOfPropertiesToIgnore) {
+ if (propertyToIgnore.equalsIgnoreCase(field)) {
+ return true;
+ }
}
}
}
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 ba943974..07e85bf0 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
@@ -3,5 +3,7 @@
*
* @see https://alps.io
*/
+@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 3ce784c2..31b7ca79 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java
@@ -26,6 +26,7 @@ import java.util.List;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.Links;
import org.springframework.hateoas.Links.MergeMode;
+import org.springframework.lang.Nullable;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -52,12 +53,12 @@ class CollectionJson {
@JsonCreator
CollectionJson(@JsonProperty("version") String version, //
- @JsonProperty("href") String href, //
- @JsonProperty("links") Links links, //
- @JsonProperty("items") List> items, //
- @JsonProperty("queries") List queries, //
- @JsonProperty("template") CollectionJsonTemplate template, //
- @JsonProperty("error") 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;
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 b6689407..7fd95ab7 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java
@@ -18,6 +18,8 @@ package org.springframework.hateoas.mediatype.collectionjson;
import lombok.Value;
import lombok.experimental.Wither;
+import org.springframework.lang.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -42,9 +44,9 @@ class CollectionJsonData {
private String prompt;
@JsonCreator
- CollectionJsonData(@JsonProperty("name") String name, @JsonProperty("value") Object value,
- @JsonProperty("prompt") String prompt) {
-
+ CollectionJsonData(@JsonProperty("name") @Nullable String name, @JsonProperty("value") @Nullable Object value,
+ @JsonProperty("prompt") @Nullable String prompt) {
+
this.name = name;
this.value = value;
this.prompt = prompt;
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonError.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonError.java
index 1f7af474..6699e82b 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonError.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonError.java
@@ -19,6 +19,8 @@ import lombok.AccessLevel;
import lombok.Value;
import lombok.experimental.Wither;
+import org.springframework.lang.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -34,8 +36,8 @@ class CollectionJsonError {
private String message;
@JsonCreator
- CollectionJsonError(@JsonProperty("title") String title, @JsonProperty("code") String code,
- @JsonProperty("message") String message) {
+ CollectionJsonError(@JsonProperty("title") @Nullable String title, @JsonProperty("code") @Nullable String code,
+ @JsonProperty("message") @Nullable String message) {
this.title = title;
this.code = code;
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 f16fb0ba..171451b8 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java
@@ -30,6 +30,7 @@ import org.springframework.hateoas.Link;
import org.springframework.hateoas.Links;
import org.springframework.hateoas.Links.MergeMode;
import org.springframework.hateoas.mediatype.PropertyUtils;
+import org.springframework.lang.Nullable;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -54,9 +55,9 @@ class CollectionJsonItem {
private @Getter(onMethod = @__({ @JsonIgnore }), value = AccessLevel.PRIVATE) T rawData;
@JsonCreator
- CollectionJsonItem(@JsonProperty("href") String href, //
- @JsonProperty("data") List data, //
- @JsonProperty("links") Links links) {
+ CollectionJsonItem(@JsonProperty("href") @Nullable String href, //
+ @JsonProperty("data") @Nullable List data, //
+ @JsonProperty("links") @Nullable Links links) {
this.href = href;
this.data = data;
@@ -84,7 +85,7 @@ class CollectionJsonItem {
return this.data;
}
- if (PRIMITIVE_TYPES.contains(this.rawData.getClass())) {
+ if (this.rawData != null && PRIMITIVE_TYPES.contains(this.rawData.getClass())) {
return Collections.singletonList(new CollectionJsonData().withValue(this.rawData));
}
@@ -99,8 +100,13 @@ class CollectionJsonItem {
* @param javaType - type of the object to create
* @return
*/
+ @Nullable
public Object toRawData(JavaType javaType) {
+ if (this.data == null) {
+ return null;
+ }
+
if (PRIMITIVE_TYPES.contains(javaType.getRawClass())) {
return this.data.get(0).getValue();
}
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonQuery.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonQuery.java
index c40d0e92..ddf672da 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonQuery.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonQuery.java
@@ -22,6 +22,8 @@ import lombok.experimental.Wither;
import java.util.List;
+import org.springframework.lang.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -33,21 +35,17 @@ import com.fasterxml.jackson.annotation.JsonProperty;
@Wither
class CollectionJsonQuery {
- @JsonInclude(Include.NON_NULL)
- private String rel;
+ @JsonInclude(Include.NON_NULL) private String rel;
- @JsonInclude(Include.NON_NULL)
- private String href;
-
- @JsonInclude(Include.NON_NULL)
- private String prompt;
+ @JsonInclude(Include.NON_NULL) private String href;
- @JsonInclude(Include.NON_EMPTY)
- private List data;
+ @JsonInclude(Include.NON_NULL) private String prompt;
+
+ @JsonInclude(Include.NON_EMPTY) private List data;
@JsonCreator
- CollectionJsonQuery(@JsonProperty("rel") String rel, @JsonProperty("href") String href,
- @JsonProperty("prompt") String prompt, @JsonProperty("data") List data) {
+ CollectionJsonQuery(@JsonProperty("rel") @Nullable String rel, @JsonProperty("href") @Nullable String href,
+ @JsonProperty("prompt") @Nullable String prompt, @JsonProperty("data") @Nullable List data) {
this.rel = rel;
this.href = href;
diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonTemplate.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonTemplate.java
index 8cc1cc0f..f283c808 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonTemplate.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonTemplate.java
@@ -20,6 +20,8 @@ import lombok.experimental.Wither;
import java.util.List;
+import org.springframework.lang.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -33,7 +35,7 @@ class CollectionJsonTemplate {
private List data;
@JsonCreator
- CollectionJsonTemplate(@JsonProperty("data") List data) {
+ CollectionJsonTemplate(@JsonProperty("data") @Nullable List data) {
this.data = data;
}
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 1e14196b..8f864c1a 100644
--- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/Jackson2CollectionJsonModule.java
+++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/Jackson2CollectionJsonModule.java
@@ -38,6 +38,7 @@ import org.springframework.hateoas.RepresentationModel;
import org.springframework.hateoas.mediatype.JacksonHelper;
import org.springframework.hateoas.mediatype.PropertyUtils;
import org.springframework.http.HttpMethod;
+import org.springframework.lang.Nullable;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
@@ -137,6 +138,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentSerializer()
*/
@Override
+ @Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
@@ -155,6 +157,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.ContainerSerializer#_withValueTypeSerializer(com.fasterxml.jackson.databind.jsontype.TypeSerializer)
*/
@Override
+ @Nullable
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -171,7 +174,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
this(null);
}
- CollectionJsonResourceSupportSerializer(BeanProperty property) {
+ CollectionJsonResourceSupportSerializer(@Nullable BeanProperty property) {
super(RepresentationModel.class, false);
this.property = property;
@@ -211,11 +214,13 @@ class Jackson2CollectionJsonModule extends SimpleModule {
}
@Override
+ @Nullable
public JavaType getContentType() {
return null;
}
@Override
+ @Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
@@ -226,6 +231,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
}
@Override
+ @Nullable
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -242,7 +248,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
this(null);
}
- CollectionJsonResourceSerializer(BeanProperty property) {
+ CollectionJsonResourceSerializer(@Nullable BeanProperty property) {
super(EntityModel.class, false);
this.property = property;
@@ -278,11 +284,13 @@ class Jackson2CollectionJsonModule extends SimpleModule {
}
@Override
+ @Nullable
public JavaType getContentType() {
return null;
}
@Override
+ @Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
@@ -293,6 +301,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
}
@Override
+ @Nullable
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -333,6 +342,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentType()
*/
@Override
+ @Nullable
public JavaType getContentType() {
return null;
}
@@ -342,6 +352,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentSerializer()
*/
@Override
+ @Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
@@ -369,6 +380,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.ser.ContainerSerializer#_withValueTypeSerializer(com.fasterxml.jackson.databind.jsontype.TypeSerializer)
*/
@Override
+ @Nullable
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -385,7 +397,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
this(null);
}
- CollectionJsonPagedResourcesSerializer(BeanProperty property) {
+ CollectionJsonPagedResourcesSerializer(@Nullable BeanProperty property) {
super(CollectionModel.class, false);
this.property = property;
@@ -414,11 +426,13 @@ class Jackson2CollectionJsonModule extends SimpleModule {
}
@Override
+ @Nullable
public JavaType getContentType() {
return null;
}
@Override
+ @Nullable
public JsonSerializer> getContentSerializer() {
return null;
}
@@ -434,6 +448,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
}
@Override
+ @Nullable
protected ContainerSerializer> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@@ -452,6 +467,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.deser.std.ContainerDeserializerBase#getContentType()
*/
@Override
+ @Nullable
public JavaType getContentType() {
return null;
}
@@ -461,6 +477,7 @@ class Jackson2CollectionJsonModule extends SimpleModule {
* @see com.fasterxml.jackson.databind.deser.std.ContainerDeserializerBase#getContentDeserializer()
*/
@Override
+ @Nullable
public JsonDeserializer