Skip to content

Commit 479da17

Browse files
committed
Bit more cleanup wrt #2457
1 parent d1959f8 commit 479da17

File tree

8 files changed

+25
-14
lines changed

8 files changed

+25
-14
lines changed

src/main/java/com/fasterxml/jackson/databind/JavaType.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.fasterxml.jackson.core.type.ResolvedType;
77
import com.fasterxml.jackson.databind.type.TypeBindings;
88
import com.fasterxml.jackson.databind.type.TypeFactory;
9+
import com.fasterxml.jackson.databind.util.ClassUtil;
910

1011
/**
1112
* Base class for type token classes used both to contain information
@@ -290,8 +291,8 @@ public boolean isConcrete() {
290291
@Override
291292
public final boolean isEnumType() {
292293
// 29-Sep-2019, tatu: `Class.isEnum()` not enough to detect custom subtypes,
293-
// use this instead
294-
// return Enum.class.isAssignableFrom(_class);
294+
// but for some reason this fix will break couple of unit tests:
295+
// return ClassUtil.isEnumType(_class);
295296
return _class.isEnum();
296297
}
297298

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/ClassNameIdResolver.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ protected JavaType _typeFromId(String id, DatabindContext ctxt) throws IOExcepti
8989
protected String _idFrom(Object value, Class<?> cls, TypeFactory typeFactory)
9090
{
9191
// Need to ensure that "enum subtypes" work too
92-
if (Enum.class.isAssignableFrom(cls)) {
92+
if (ClassUtil.isEnumType(cls)) {
9393
if (!cls.isEnum()) { // means that it's sub-class of base enum, so:
9494
cls = cls.getSuperclass();
9595
}

src/main/java/com/fasterxml/jackson/databind/module/SimpleDeserializers.java

+4
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ public JsonDeserializer<?> findEnumDeserializer(Class<?> type,
126126
}
127127
JsonDeserializer<?> deser = _classMappings.get(new ClassKey(type));
128128
if (deser == null) {
129+
// 29-Sep-2019, tatu: Not 100% sure this is workable logic but leaving
130+
// as is (wrt [databind#2457]. Probably works ok since this covers direct
131+
// sub-classes of `Enum`; but even if custom sub-classes aren't, unlikely
132+
// mapping for those ever requested for deserialization
129133
if (_hasEnumDeserializer && type.isEnum()) {
130134
deser = _classMappings.get(new ClassKey(Enum.class));
131135
}

src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ protected final JsonSerializer<?> findSerializerByPrimaryType(SerializerProvider
421421
}
422422
return NumberSerializer.instance;
423423
}
424-
if (Enum.class.isAssignableFrom(raw)) {
424+
if (ClassUtil.isEnumType(raw) && raw != Enum.class) {
425425
return buildEnumSerializer(prov.getConfig(), type, beanDesc);
426426
}
427427
return null;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
249249
*/
250250
final JavaType type = _accessor.getType();
251251
Class<?> declaring = _accessor.getDeclaringClass();
252-
if ((declaring != null) && declaring.isEnum()) {
252+
if ((declaring != null) && ClassUtil.isEnumType(declaring)) {
253253
if (_acceptJsonFormatVisitorForEnum(visitor, typeHint, declaring)) {
254254
return;
255255
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public static JsonSerializer<Object> getFallbackKeySerializer(SerializationConfi
100100
}
101101
// 29-Sep-2019, tatu: [databind#2457] can not use 'rawKeyType.isEnum()`, won't work
102102
// for subtypes.
103-
if (Enum.class.isAssignableFrom(rawKeyType)) {
103+
if (ClassUtil.isEnumType(rawKeyType)) {
104104
return EnumKeySerializer.construct(rawKeyType,
105105
EnumValues.constructFromName(config, (Class<Enum<?>>) rawKeyType));
106106
}

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public static String canBeABeanType(Class<?> type)
169169
if (type.isArray()) {
170170
return "array";
171171
}
172-
if (type.isEnum()) {
172+
if (Enum.class.isAssignableFrom(type)) {
173173
return "enum";
174174
}
175175
if (type.isPrimitive()) {
@@ -954,6 +954,16 @@ public static void checkAndFixAccess(Member member, boolean force)
954954
/**********************************************************
955955
*/
956956

957+
/**
958+
* Helper method that encapsulates reliable check on whether
959+
* given raw type "is an Enum", that is, is or extends {@link java.lang.Enum}.
960+
*
961+
* @since 2.10.1
962+
*/
963+
public static boolean isEnumType(Class<?> rawType) {
964+
return Enum.class.isAssignableFrom(rawType);
965+
}
966+
957967
/**
958968
* Helper method that can be used to dynamically figure out
959969
* enumeration type of given {@link EnumSet}, without having

src/test/java/com/fasterxml/jackson/databind/ser/TestEnumSerialization.java

+3-7
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,8 @@ public void testSimple() throws Exception
147147

148148
public void testEnumSet() throws Exception
149149
{
150-
StringWriter sw = new StringWriter();
151-
EnumSet<TestEnum> value = EnumSet.of(TestEnum.B);
152-
MAPPER.writeValue(sw, value);
153-
assertEquals("[\"B\"]", sw.toString());
150+
final EnumSet<TestEnum> value = EnumSet.of(TestEnum.B);
151+
assertEquals("[\"B\"]", MAPPER.writeValueAsString(value));
154152
}
155153

156154
/**
@@ -160,9 +158,7 @@ public void testEnumSet() throws Exception
160158
*/
161159
public void testEnumUsingToString() throws Exception
162160
{
163-
StringWriter sw = new StringWriter();
164-
MAPPER.writeValue(sw, AnnotatedTestEnum.C2);
165-
assertEquals("\"c2\"", sw.toString());
161+
assertEquals("\"c2\"", MAPPER.writeValueAsString(AnnotatedTestEnum.C2));
166162
}
167163

168164
public void testSubclassedEnums() throws Exception

0 commit comments

Comments
 (0)