From 6b2fbba10e5a7dd32c6572a2a5d1de44f253b179 Mon Sep 17 00:00:00 2001 From: Cowtowncoder Date: Tue, 21 Apr 2015 15:05:29 -0700 Subject: [PATCH] Fix a regression bug wrt serialization of enums (triggered a fail on JSON-schema module) --- .../databind/ser/std/EnumSerializer.java | 19 ++++--- .../jackson/databind/util/EnumValues.java | 9 ++++ .../databind/jsonschema/NewSchemaTest.java | 54 +++++++++++++++++++ 3 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 src/test/java/com/fasterxml/jackson/databind/jsonschema/NewSchemaTest.java diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java index bf4c68df1b..d69bbefddc 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java @@ -172,16 +172,19 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t } return; } - boolean usingToString = (serializers != null) && - serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); - JsonStringFormatVisitor stringVisitor = visitor.expectStringFormat(typeHint); - if (typeHint != null && stringVisitor != null) { + if (stringVisitor != null) { Set enums = new LinkedHashSet(); - for (SerializableString value : _values.values()) { - if (usingToString) { - enums.add(value.toString()); - } else { + + // Use toString()? + if ((serializers != null) && + serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING)) { + for (Enum e : _values.enums()) { + enums.add(e.toString()); + } + } else { + // No, serialize using name() or explicit overrides + for (SerializableString value : _values.values()) { enums.add(value.getValue()); } } diff --git a/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java b/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java index 41d6530f9d..ac41c9f4be 100644 --- a/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java +++ b/src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java @@ -75,6 +75,15 @@ public Collection values() { return Arrays.asList(_textual); } + /** + * Convenience accessor for getting raw Enum instances. + * + * @since 2.6 + */ + public List> enums() { + return Arrays.asList(_values); + } + /** * Method used for serialization and introspection by core Jackson code. */ diff --git a/src/test/java/com/fasterxml/jackson/databind/jsonschema/NewSchemaTest.java b/src/test/java/com/fasterxml/jackson/databind/jsonschema/NewSchemaTest.java new file mode 100644 index 0000000000..41bb4c10c6 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/jsonschema/NewSchemaTest.java @@ -0,0 +1,54 @@ +package com.fasterxml.jackson.databind.jsonschema; + +import java.util.*; + +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonStringFormatVisitor; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat; + +/** + * Basic tests to exercise low-level support added for JSON Schema module and + * other modules that use type introspection. + */ +public class NewSchemaTest extends BaseMapTest +{ + enum TestEnum { + A, B, C; + + @Override + public String toString() { + return "ToString:"+name(); + } + } + + private final ObjectMapper MAPPER = new ObjectMapper(); + + public void testSimpleEnum() throws Exception + { + final Set values = new TreeSet(); + ObjectWriter w = MAPPER.writer(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + + w.acceptJsonFormatVisitor(TestEnum.class, new JsonFormatVisitorWrapper.Base() { + @Override + public JsonStringFormatVisitor expectStringFormat(JavaType type) { + return new JsonStringFormatVisitor() { + public void enumTypes(Set enums) { + values.addAll(enums); + } + + @Override + public void format(JsonValueFormat format) { } + }; + } + }); + + assertEquals(3, values.size()); + TreeSet exp = new TreeSet(Arrays.asList( + "ToString:A", + "ToString:B", + "ToString:C" + )); + assertEquals(exp, values); + } +}