diff --git a/src/main/java/org/springframework/hateoas/Link.java b/src/main/java/org/springframework/hateoas/Link.java index 72a3a219..dc2b34d2 100755 --- a/src/main/java/org/springframework/hateoas/Link.java +++ b/src/main/java/org/springframework/hateoas/Link.java @@ -37,6 +37,7 @@ import org.springframework.util.StringUtils; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Value object for links. @@ -46,9 +47,9 @@ import com.fasterxml.jackson.annotation.JsonInclude; * @author Jens Schauder */ @JsonInclude(JsonInclude.Include.NON_NULL) -@JsonIgnoreProperties(value = "templated", ignoreUnknown = true) +@JsonIgnoreProperties(value = { "templated", "template" }, ignoreUnknown = true) @AllArgsConstructor(access = AccessLevel.PACKAGE) -@Getter +@Getter(onMethod = @__(@JsonProperty)) @EqualsAndHashCode( of = { "rel", "href", "hreflang", "media", "title", "type", "deprecation", "profile", "name", "affordances" }) public class Link implements Serializable { 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 97e6f49b..caede5a8 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java +++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJson.java @@ -16,6 +16,7 @@ package org.springframework.hateoas.mediatype.collectionjson; import lombok.AccessLevel; +import lombok.Getter; import lombok.Value; import lombok.experimental.Wither; @@ -39,6 +40,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; * @author Greg Turnquist */ @Value +@Getter(onMethod = @__(@JsonProperty)) @Wither(AccessLevel.PACKAGE) class CollectionJson { 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 1c4e4ff9..dbfd859a 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java +++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonData.java @@ -15,13 +15,13 @@ */ package org.springframework.hateoas.mediatype.collectionjson; +import lombok.Getter; 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; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; @@ -30,17 +30,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; * @author Greg Turnquist */ @Value +@Getter(onMethod = @__(@JsonProperty)) +@JsonInclude(Include.NON_NULL) @Wither -@JsonIgnoreProperties() class CollectionJsonData { - @JsonInclude(Include.NON_NULL) // private @Nullable String name; - - @JsonInclude(Include.NON_NULL) // private @Nullable Object value; - - @JsonInclude(Include.NON_NULL) // private @Nullable String prompt; @JsonCreator diff --git a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonDocument.java b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonDocument.java index 9b828299..1bde0a21 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonDocument.java +++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonDocument.java @@ -16,6 +16,7 @@ package org.springframework.hateoas.mediatype.collectionjson; import lombok.AccessLevel; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Value; import lombok.experimental.Wither; @@ -33,6 +34,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; * @author Greg Turnquist */ @Value +@Getter(onMethod = @__(@JsonProperty)) @Wither(AccessLevel.PACKAGE) @RequiredArgsConstructor(access = AccessLevel.PACKAGE) class CollectionJsonDocument { 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 19741849..a45e14d3 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java +++ b/src/main/java/org/springframework/hateoas/mediatype/collectionjson/CollectionJsonItem.java @@ -45,6 +45,7 @@ import com.fasterxml.jackson.databind.JavaType; * @author Greg Turnquist */ @Value +@Getter(onMethod = @__(@JsonProperty)) @Wither(AccessLevel.PACKAGE) @RequiredArgsConstructor(access = AccessLevel.PACKAGE) class CollectionJsonItem { @@ -79,6 +80,7 @@ class CollectionJsonItem { * * @return */ + @JsonProperty public List getData() { if (!this.data.isEmpty()) { diff --git a/src/main/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsProperty.java b/src/main/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsProperty.java index 379efc70..6d9e9faa 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsProperty.java +++ b/src/main/java/org/springframework/hateoas/mediatype/hal/forms/HalFormsProperty.java @@ -17,6 +17,7 @@ package org.springframework.hateoas.mediatype.hal.forms; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.ToString; @@ -29,6 +30,7 @@ import org.springframework.hateoas.AffordanceModel.PropertyMetadataConfigured; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Describe a parameter for the associated state transition in a HAL-FORMS document. A {@link HalFormsTemplate} may @@ -39,6 +41,7 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; @JsonInclude(Include.NON_DEFAULT) @Value @Wither +@Getter(onMethod = @__(@JsonProperty)) @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(force = true) @ToString diff --git a/src/main/java/org/springframework/hateoas/mediatype/uber/Uber.java b/src/main/java/org/springframework/hateoas/mediatype/uber/Uber.java index 75da786a..6d933381 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/uber/Uber.java +++ b/src/main/java/org/springframework/hateoas/mediatype/uber/Uber.java @@ -16,6 +16,7 @@ package org.springframework.hateoas.mediatype.uber; import lombok.AccessLevel; +import lombok.Getter; import lombok.Value; import lombok.experimental.Wither; @@ -37,6 +38,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; * @since 1.0 */ @Value +@Getter(onMethod = @__(@JsonProperty)) @Wither(AccessLevel.PACKAGE) @JsonInclude(Include.NON_NULL) class Uber { @@ -74,5 +76,4 @@ class Uber { .flatMap(uberData -> uberData.getLinks().stream()) // .collect(Links.collector()); } - } diff --git a/src/main/java/org/springframework/hateoas/mediatype/uber/UberData.java b/src/main/java/org/springframework/hateoas/mediatype/uber/UberData.java index 64745cee..fe7d4437 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/uber/UberData.java +++ b/src/main/java/org/springframework/hateoas/mediatype/uber/UberData.java @@ -17,6 +17,7 @@ package org.springframework.hateoas.mediatype.uber; import lombok.AccessLevel; import lombok.Data; +import lombok.Getter; import lombok.Value; import lombok.experimental.Wither; @@ -42,6 +43,7 @@ import org.springframework.hateoas.RepresentationModel; import org.springframework.hateoas.mediatype.PropertyUtils; import org.springframework.http.HttpMethod; import org.springframework.lang.Nullable; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import com.fasterxml.jackson.annotation.JsonCreator; @@ -58,6 +60,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; * @since 1.0 */ @Value +@Getter(onMethod = @__(@JsonProperty)) @Wither(AccessLevel.PACKAGE) @JsonInclude(Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) @@ -105,6 +108,7 @@ class UberData { * Don't render if it's {@link UberAction#READ}. */ @Nullable + @JsonProperty public UberAction getAction() { return action == UberAction.READ ? null : action; } @@ -113,6 +117,7 @@ class UberData { * Use a {@link Boolean} to support returning {@literal null}, and if it is {@literal null}, don't render. */ @Nullable + @JsonProperty public Boolean isTemplated() { return Optional.ofNullable(this.url) // @@ -124,6 +129,7 @@ class UberData { * Use a {@link Boolean} to support returning {@literal null}, and if it is {@literal null}, don't render. */ @Nullable + @JsonProperty public Boolean isTransclude() { return this.transclude ? true : null; } @@ -147,6 +153,10 @@ class UberData { .orElse(Collections.emptyList()); } + private boolean hasUrl(@Nullable String url) { + return ObjectUtils.nullSafeEquals(this.url, url); + } + /** * Simple scalar types that can be encoded by value, not type. */ @@ -363,7 +373,7 @@ class UberData { return affordanceBasedLinks.stream() // .flatMap(affordance -> links.stream() // - .filter(link -> link.getUrl().equals(affordance.getUrl())) // + .filter(data -> data.hasUrl(affordance.getUrl())) // .map(link -> { if (link.getAction() == affordance.getAction()) { diff --git a/src/main/java/org/springframework/hateoas/mediatype/uber/UberDocument.java b/src/main/java/org/springframework/hateoas/mediatype/uber/UberDocument.java index 0a00c3d2..baa90195 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/uber/UberDocument.java +++ b/src/main/java/org/springframework/hateoas/mediatype/uber/UberDocument.java @@ -16,6 +16,7 @@ package org.springframework.hateoas.mediatype.uber; import lombok.AccessLevel; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Value; import lombok.experimental.Wither; @@ -34,6 +35,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; * @since 1.0 */ @Value +@Getter(onMethod = @__(@JsonProperty)) @Wither(AccessLevel.PACKAGE) @RequiredArgsConstructor(access = AccessLevel.PACKAGE) class UberDocument { diff --git a/src/test/java/org/springframework/hateoas/AbstractJackson2MarshallingIntegrationTest.java b/src/test/java/org/springframework/hateoas/AbstractJackson2MarshallingIntegrationTest.java index b1d835cd..25c77e70 100755 --- a/src/test/java/org/springframework/hateoas/AbstractJackson2MarshallingIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/AbstractJackson2MarshallingIntegrationTest.java @@ -20,11 +20,12 @@ import java.io.Writer; import org.junit.jupiter.api.BeforeEach; +import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; /** * Base class to test objects against the Jackson 2.0 {@link ObjectMapper}. - * + * * @author Oliver Gierke * @author Jon Brisbin * @author Greg Turnquist @@ -36,6 +37,11 @@ public abstract class AbstractJackson2MarshallingIntegrationTest { @BeforeEach void setUp() { mapper = new ObjectMapper(); + mapper.disable(MapperFeature.AUTO_DETECT_CREATORS) // + .disable(MapperFeature.AUTO_DETECT_FIELDS) // + .disable(MapperFeature.AUTO_DETECT_GETTERS) // + .disable(MapperFeature.AUTO_DETECT_IS_GETTERS) // + .disable(MapperFeature.AUTO_DETECT_SETTERS); } protected String write(Object object) throws Exception { diff --git a/src/test/java/org/springframework/hateoas/mediatype/hal/SimplePojo.java b/src/test/java/org/springframework/hateoas/mediatype/hal/SimplePojo.java index b41f62ba..9eebf931 100644 --- a/src/test/java/org/springframework/hateoas/mediatype/hal/SimplePojo.java +++ b/src/test/java/org/springframework/hateoas/mediatype/hal/SimplePojo.java @@ -2,9 +2,13 @@ package org.springframework.hateoas.mediatype.hal; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import com.fasterxml.jackson.annotation.JsonProperty; + @Data +@Getter(onMethod = @__(@JsonProperty)) @NoArgsConstructor @AllArgsConstructor public class SimplePojo {