diff --git a/contentgrid-spring-data-rest/src/main/java/com/contentgrid/spring/data/rest/mapping/jackson/JacksonBasedProperty.java b/contentgrid-spring-data-rest/src/main/java/com/contentgrid/spring/data/rest/mapping/jackson/JacksonBasedProperty.java index bcd5a37a..a3b259bf 100644 --- a/contentgrid-spring-data-rest/src/main/java/com/contentgrid/spring/data/rest/mapping/jackson/JacksonBasedProperty.java +++ b/contentgrid-spring-data-rest/src/main/java/com/contentgrid/spring/data/rest/mapping/jackson/JacksonBasedProperty.java @@ -5,15 +5,38 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty.Access; +import com.fasterxml.jackson.annotation.JsonValue; import java.lang.annotation.Annotation; +import java.util.ArrayList; import java.util.Optional; import java.util.function.Predicate; -import lombok.RequiredArgsConstructor; import org.springframework.data.util.TypeInformation; -@RequiredArgsConstructor public class JacksonBasedProperty implements Property { private final Property delegate; + private final JacksonBasedProperty value; + + public JacksonBasedProperty(Property delegate) { + this.delegate = delegate; + this.value = findJsonValue().orElse(null); + } + + protected Optional findJsonValue() { + var values = new ArrayList(); + delegate.nestedContainer() + .ifPresent(container -> { + container.doWithProperties(property -> { + var jsonValue = property.findAnnotation(JsonValue.class) + .map(JsonValue::value) + .orElse(false); + if (jsonValue) { + values.add(property); + } + }); + }); + return values.stream().findFirst() + .map(JacksonBasedProperty::new); + } protected Optional preferredName() { return delegate.findAnnotation(JsonProperty.class) @@ -28,6 +51,9 @@ public String getName() { @Override public TypeInformation getTypeInformation() { + if (value != null) { + return value.getTypeInformation(); + } return delegate.getTypeInformation(); } @@ -55,6 +81,9 @@ public boolean isReadOnly() { @Override public Optional nestedContainer() { + if (value != null) { + return value.nestedContainer(); + } return delegate.nestedContainer() .map(JacksonBasedContainer::new); }