Skip to content

Commit 6b2fbba

Browse files
committed
Fix a regression bug wrt serialization of enums (triggered a fail on JSON-schema module)
1 parent ee6a3ca commit 6b2fbba

File tree

3 files changed

+74
-8
lines changed

3 files changed

+74
-8
lines changed

src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSerializer.java

+11-8
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,19 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
172172
}
173173
return;
174174
}
175-
boolean usingToString = (serializers != null) &&
176-
serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
177-
178175
JsonStringFormatVisitor stringVisitor = visitor.expectStringFormat(typeHint);
179-
if (typeHint != null && stringVisitor != null) {
176+
if (stringVisitor != null) {
180177
Set<String> enums = new LinkedHashSet<String>();
181-
for (SerializableString value : _values.values()) {
182-
if (usingToString) {
183-
enums.add(value.toString());
184-
} else {
178+
179+
// Use toString()?
180+
if ((serializers != null) &&
181+
serializers.isEnabled(SerializationFeature.WRITE_ENUMS_USING_TO_STRING)) {
182+
for (Enum<?> e : _values.enums()) {
183+
enums.add(e.toString());
184+
}
185+
} else {
186+
// No, serialize using name() or explicit overrides
187+
for (SerializableString value : _values.values()) {
185188
enums.add(value.getValue());
186189
}
187190
}

src/main/java/com/fasterxml/jackson/databind/util/EnumValues.java

+9
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ public Collection<SerializableString> values() {
7575
return Arrays.asList(_textual);
7676
}
7777

78+
/**
79+
* Convenience accessor for getting raw Enum instances.
80+
*
81+
* @since 2.6
82+
*/
83+
public List<Enum<?>> enums() {
84+
return Arrays.asList(_values);
85+
}
86+
7887
/**
7988
* Method used for serialization and introspection by core Jackson code.
8089
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.fasterxml.jackson.databind.jsonschema;
2+
3+
import java.util.*;
4+
5+
import com.fasterxml.jackson.databind.*;
6+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
7+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonStringFormatVisitor;
8+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat;
9+
10+
/**
11+
* Basic tests to exercise low-level support added for JSON Schema module and
12+
* other modules that use type introspection.
13+
*/
14+
public class NewSchemaTest extends BaseMapTest
15+
{
16+
enum TestEnum {
17+
A, B, C;
18+
19+
@Override
20+
public String toString() {
21+
return "ToString:"+name();
22+
}
23+
}
24+
25+
private final ObjectMapper MAPPER = new ObjectMapper();
26+
27+
public void testSimpleEnum() throws Exception
28+
{
29+
final Set<String> values = new TreeSet<String>();
30+
ObjectWriter w = MAPPER.writer(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
31+
32+
w.acceptJsonFormatVisitor(TestEnum.class, new JsonFormatVisitorWrapper.Base() {
33+
@Override
34+
public JsonStringFormatVisitor expectStringFormat(JavaType type) {
35+
return new JsonStringFormatVisitor() {
36+
public void enumTypes(Set<String> enums) {
37+
values.addAll(enums);
38+
}
39+
40+
@Override
41+
public void format(JsonValueFormat format) { }
42+
};
43+
}
44+
});
45+
46+
assertEquals(3, values.size());
47+
TreeSet<String> exp = new TreeSet<String>(Arrays.asList(
48+
"ToString:A",
49+
"ToString:B",
50+
"ToString:C"
51+
));
52+
assertEquals(exp, values);
53+
}
54+
}

0 commit comments

Comments
 (0)