diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JacksonSerializers.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JacksonSerializers.java index 1bce91a8b..4204621ac 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JacksonSerializers.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JacksonSerializers.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.springframework.data.rest.webmvc.json.JsonSchema.EnumProperty; import org.springframework.data.rest.webmvc.json.JsonSchema.JsonSchemaProperty; @@ -44,8 +46,9 @@ * Custom Spring Data REST Jackson serializers. * * @author Oliver Gierke - * @since 2.4 + * @author Doug Busley * @soundtrack Wallis Bird - I Could Be Your Man (Yeah! Wallis Bird Live 2007-2014) + * @since 2.4 */ public class JacksonSerializers extends SimpleModule { @@ -117,7 +120,14 @@ public JsonSchemaProperty customize(JsonSchemaProperty property, TypeInformation values.add(translator.asText((Enum) value)); } - return ((EnumProperty) property).withValues(values); + if (property instanceof EnumProperty) { + return ((EnumProperty) property).withValues(values); + } + + property.items = Stream.of(new Object[][]{{"enum", values}, {"type", "string"}}) + .collect(Collectors.toMap(data -> (String) data[0], data -> data[1])); + + return property; } } diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JsonSchema.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JsonSchema.java index 004f3508d..8c5152065 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JsonSchema.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/JsonSchema.java @@ -46,6 +46,7 @@ * * @author Jon Brisbin * @author Oliver Gierke + * @author Doug Busley */ @JsonInclude(Include.NON_EMPTY) public class JsonSchema { @@ -333,7 +334,7 @@ public static class JsonSchemaProperty extends AbstractJsonSchemaProperty items; + public Map items; JsonSchemaProperty(String name, String title, String description, boolean required) { diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/EnumTranslatorUnitTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/EnumTranslatorUnitTests.java index 6d75e95fe..3746640df 100755 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/EnumTranslatorUnitTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/EnumTranslatorUnitTests.java @@ -17,18 +17,23 @@ import static org.assertj.core.api.Assertions.*; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; import org.junit.Before; import org.junit.Test; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.support.StaticMessageSource; +import org.springframework.data.util.ClassTypeInformation; +import org.springframework.data.util.TypeInformation; import org.springframework.hateoas.mediatype.MessageResolver; /** * Unit tests for {@link EnumTranslator}. * * @author Oliver Gierke + * @author Doug Busley */ public class EnumTranslatorUnitTests { @@ -145,6 +150,32 @@ public void doesNotResolveEnumNameAsFallbackIfConfigured() { assertThat(configuration.fromText(MyEnum.class, "SECOND_VALUE")).isNull(); } + @Test // DATAREST-1326 + @SuppressWarnings("unchecked") + public void doesNotFailOnEnumListsWithEnumTranslation() { + final TypeInformation type = ClassTypeInformation.from(MyEnum.class); + + JsonSchema.JsonSchemaProperty jsonSchemaProperty = + new JsonSchema.JsonSchemaProperty("foo", null, "bar", true) + .with(ClassTypeInformation.from(List.class)); + JacksonSerializers.EnumTranslatingSerializer serializer = new + JacksonSerializers.EnumTranslatingSerializer(configuration); + JsonSchema.JsonSchemaProperty result = serializer.customize(jsonSchemaProperty, type); + + ArrayList enums = (ArrayList) result.items.get("enum"); + + // Enum values are placed in the items object + assertThat(enums.size()).isEqualTo(2); + assertThat(enums.get(0)).isEqualTo("Translated"); + assertThat(enums.get(1)).isEqualTo("Second value"); + + // type of the result object is array + assertThat(result.type).isEqualTo("array"); + + // type of the items object is string + assertThat(result.items.get("type")).isEqualTo("string"); + } + static enum MyEnum { FIRST_VALUE, SECOND_VALUE; }