Skip to content

Commit 28c4ada

Browse files
committed
Verified #594 works for 2.5.0, improved access handling
1 parent 2d64bed commit 28c4ada

File tree

6 files changed

+41
-10
lines changed

6 files changed

+41
-10
lines changed

release-notes/CREDITS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,6 @@ Konstantin Labun (kulabun@github)
188188
* Reported #647: Deserialization fails when @JsonUnwrapped property contains an object with same property name
189189
(2.5.0)
190190

191+
Christopher Smith (chrylis@github)
192+
* Reported #594: `@JsonValue` on enum not used when enum value is a Map key
193+
(2.5.0)

release-notes/VERSION

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ Project: jackson-databind
4242
(requested by herau@github)
4343
#576: Add fluent API for adding mixins
4444
(contributed by Adam S, adstro@github)
45+
#594: `@JsonValue` on enum not used when enum value is a Map key
46+
(reported by chrylis@github)
4547
#596: Add support for `@JsonProperty.defaultValue`, exposed via `BeanProperty.getMetadata().getDefaultValue()`
4648
#597: Improve error messaging for cases where JSON Creator returns null (which
4749
is illegal)

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,11 @@ public JsonSerializer<Object> createKeySerializer(SerializationConfig config,
230230
final Class<?> rawType = am.getRawReturnType();
231231
JsonSerializer<?> delegate = StdKeySerializers.getStdKeySerializer(config,
232232
rawType, true);
233-
ser = new JsonValueSerializer(am.getAnnotated(), delegate);
233+
Method m = am.getAnnotated();
234+
if (config.canOverrideAccessModifiers()) {
235+
ClassUtil.checkAndFixAccess(m);
236+
}
237+
ser = new JsonValueSerializer(m, delegate);
234238
} else {
235239
ser = StdKeySerializers.getDefault();
236240
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,7 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
149149
*/
150150

151151
@Override
152-
public void serialize(Object bean, JsonGenerator jgen, SerializerProvider prov)
153-
throws IOException, JsonGenerationException
152+
public void serialize(Object bean, JsonGenerator jgen, SerializerProvider prov) throws IOException
154153
{
155154
try {
156155
Object value = _accessorMethod.invoke(bean);
@@ -188,8 +187,7 @@ public void serialize(Object bean, JsonGenerator jgen, SerializerProvider prov)
188187

189188
@Override
190189
public void serializeWithType(Object bean, JsonGenerator jgen, SerializerProvider provider,
191-
TypeSerializer typeSer0)
192-
throws IOException, JsonProcessingException
190+
TypeSerializer typeSer0) throws IOException
193191
{
194192
// Regardless of other parts, first need to find value to serialize:
195193
Object value = null;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,13 @@ public ByteArraySerializer() {
177177
}
178178

179179
@Override
180-
public boolean isEmpty(byte[] value) {
180+
public boolean isEmpty(SerializerProvider prov, byte[] value) {
181181
return (value == null) || (value.length == 0);
182182
}
183183

184184
@Override
185185
public void serialize(byte[] value, JsonGenerator jgen, SerializerProvider provider)
186-
throws IOException, JsonGenerationException
186+
throws IOException
187187
{
188188
jgen.writeBinary(provider.getConfig().getBase64Variant(),
189189
value, 0, value.length);
@@ -192,7 +192,7 @@ public void serialize(byte[] value, JsonGenerator jgen, SerializerProvider provi
192192
@Override
193193
public void serializeWithType(byte[] value, JsonGenerator jgen, SerializerProvider provider,
194194
TypeSerializer typeSer)
195-
throws IOException, JsonGenerationException
195+
throws IOException
196196
{
197197
typeSer.writeTypePrefixForScalar(value, jgen);
198198
jgen.writeBinary(provider.getConfig().getBase64Variant(),
@@ -323,7 +323,7 @@ public static class CharArraySerializer extends StdSerializer<char[]>
323323
public CharArraySerializer() { super(char[].class); }
324324

325325
@Override
326-
public boolean isEmpty(char[] value) {
326+
public boolean isEmpty(SerializerProvider prov, char[] value) {
327327
return (value == null) || (value.length == 0);
328328
}
329329

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,25 @@ static class PoOverrideAsNumber
163163
@JsonFormat(shape=Shape.NUMBER)
164164
public PoNUM value = PoNUM.B;
165165
}
166-
166+
167+
static enum MyEnum594 {
168+
VALUE_WITH_A_REALLY_LONG_NAME_HERE("longValue");
169+
170+
private final String key;
171+
private MyEnum594(String k) { key = k; }
172+
173+
@JsonValue
174+
public String getKey() { return key; }
175+
}
176+
177+
static class MyStuff594 {
178+
public Map<MyEnum594,String> stuff = new EnumMap<MyEnum594,String>(MyEnum594.class);
179+
180+
public MyStuff594(String value) {
181+
stuff.put(MyEnum594.VALUE_WITH_A_REALLY_LONG_NAME_HERE, value);
182+
}
183+
}
184+
167185
/*
168186
/**********************************************************
169187
/* Tests
@@ -316,6 +334,12 @@ public void testOverrideEnumAsString() throws Exception {
316334
public void testOverrideEnumAsNumber() throws Exception {
317335
assertEquals("{\"value\":1}", mapper.writeValueAsString(new PoOverrideAsNumber()));
318336
}
337+
338+
// [databind#594]
339+
public void testJsonValueForEnumMapKey() throws Exception {
340+
assertEquals(aposToQuotes("{'stuff':{'longValue':'foo'}}"),
341+
mapper.writeValueAsString(new MyStuff594("foo")));
342+
}
319343
}
320344

321345
// [JACKSON-757], non-inner enum

0 commit comments

Comments
 (0)