Skip to content
This repository was archived by the owner on Nov 5, 2019. It is now read-only.

Commit 696681d

Browse files
committed
Partial fix for #59
1 parent 4f7a4ed commit 696681d

File tree

4 files changed

+119
-10
lines changed

4 files changed

+119
-10
lines changed

src/main/java/com/fasterxml/jackson/module/afterburner/deser/OptimizedSettableBeanProperty.java

-2
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ protected final boolean _deserializeBoolean(JsonParser p, DeserializationContext
149149
if (t == JsonToken.VALUE_FALSE) return false;
150150
if (t == JsonToken.VALUE_NULL) return false;
151151

152-
// [JACKSON-78]: should accept ints too, (0 == false, otherwise true)
153152
if (t == JsonToken.VALUE_NUMBER_INT) {
154153
// 11-Jan-2012, tatus: May be outside of int...
155154
if (p.getNumberType() == NumberType.INT) {
@@ -160,7 +159,6 @@ protected final boolean _deserializeBoolean(JsonParser p, DeserializationContext
160159
// And finally, let's allow Strings to be converted too
161160
if (t == JsonToken.VALUE_STRING) {
162161
String text = p.getText().trim();
163-
// [#422]: Allow aliases
164162
if ("true".equals(text) || "True".equals(text)) {
165163
return true;
166164
}

src/main/java/com/fasterxml/jackson/module/afterburner/ser/OptimizedBeanPropertyWriter.java

+25
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.fasterxml.jackson.core.SerializableString;
88
import com.fasterxml.jackson.databind.JsonSerializer;
99
import com.fasterxml.jackson.databind.SerializerProvider;
10+
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
1011
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
1112

1213
/**
@@ -54,6 +55,30 @@ private BeanPropertyWriter unwrapFallbackWriter(BeanPropertyWriter srcIn)
5455
return srcIn;
5556
}
5657

58+
// Overridden since 2.6.3
59+
@Override
60+
public void assignTypeSerializer(TypeSerializer typeSer) {
61+
super.assignTypeSerializer(typeSer);
62+
if (fallbackWriter != null) {
63+
fallbackWriter.assignTypeSerializer(typeSer);
64+
}
65+
// 04-Oct-2015, tatu: Should we handle this wrt [module-afterburner#59]?
66+
// Seems unlikely, as String/long/int/boolean are final types; and for
67+
// basic 'Object' we delegate to deserializer as expected
68+
}
69+
70+
// Overridden since 2.6.3
71+
@Override
72+
public void assignSerializer(JsonSerializer<Object> ser) {
73+
super.assignSerializer(ser);
74+
if (fallbackWriter != null) {
75+
fallbackWriter.assignSerializer(ser);
76+
}
77+
// 04-Oct-2015, tatu: To fix [module-afterburner#59], need to disable use of
78+
// fully optimized variant
79+
broken = true;
80+
}
81+
5782
public abstract T withAccessor(BeanPropertyAccessor acc);
5883

5984
public abstract BeanPropertyWriter withSerializer(JsonSerializer<Object> ser);

src/test/java/com/fasterxml/jackson/module/afterburner/failing/TestStdDeserializerOverrides59.java

+32-8
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
import com.fasterxml.jackson.core.*;
66
import com.fasterxml.jackson.databind.*;
7+
import com.fasterxml.jackson.databind.deser.Deserializers;
78
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
89
import com.fasterxml.jackson.databind.module.SimpleModule;
10+
911
import com.fasterxml.jackson.module.afterburner.AfterburnerTestBase;
1012

1113
@SuppressWarnings("serial")
@@ -32,21 +34,43 @@ public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx
3234
/**********************************************************************
3335
*/
3436

35-
// for [module-afterburner#59]
36-
public void testStringDeserializerOveride59() throws Exception
37+
public void testStringDeserOverideNoAfterburner() throws Exception
3738
{
3839
final String json = "{\"field\": \"value &amp; value\"}";
3940
final String EXP = "value & value";
40-
41-
final Module module = new SimpleModule("module", Version.unknownVersion())
42-
.addDeserializer(String.class, new DeAmpDeserializer());
43-
44-
// First; passes with vanilla ObjectMapper
4541
SimpleRO resultVanilla = new ObjectMapper()
46-
.registerModule(module)
42+
.registerModule(new SimpleModule("module", Version.unknownVersion())
43+
.addDeserializer(String.class, new DeAmpDeserializer()))
4744
.readValue(json, SimpleRO.class);
4845
assertEquals(EXP, resultVanilla.field);
46+
}
47+
48+
// for [module-afterburner#59]
49+
public void testStringDeserOverideWithAfterburner() throws Exception
50+
{
51+
final String json = "{\"field\": \"value &amp; value\"}";
52+
final String EXP = "value & value";
4953

54+
final Module module = new SimpleModule("module", Version.unknownVersion()) {
55+
@Override
56+
public void setupModule(SetupContext context) {
57+
context.addDeserializers(
58+
new Deserializers.Base() {
59+
@Override
60+
public JsonDeserializer<?> findBeanDeserializer(
61+
JavaType type,
62+
DeserializationConfig config,
63+
BeanDescription beanDesc)
64+
throws JsonMappingException {
65+
if (type.hasRawClass(String.class)) {
66+
return new DeAmpDeserializer();
67+
}
68+
return null;
69+
}
70+
});
71+
}
72+
};
73+
5074
// but then fails with Afterburner
5175
SimpleRO resultAB = mapperWithModule()
5276
.registerModule(module)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.fasterxml.jackson.module.afterburner.failing;
2+
3+
import java.io.IOException;
4+
5+
import com.fasterxml.jackson.core.JsonGenerator;
6+
import com.fasterxml.jackson.core.JsonParser;
7+
import com.fasterxml.jackson.core.Version;
8+
import com.fasterxml.jackson.databind.DeserializationContext;
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import com.fasterxml.jackson.databind.SerializerProvider;
11+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
12+
import com.fasterxml.jackson.databind.module.SimpleModule;
13+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
14+
import com.fasterxml.jackson.module.afterburner.AfterburnerTestBase;
15+
16+
public class TestStdSerializerOverrides extends AfterburnerTestBase
17+
{
18+
// for [module-afterburner#59]
19+
static class SimpleRO {
20+
public String field = "foo";
21+
}
22+
23+
@SuppressWarnings("serial")
24+
static class MeaningOfLifeSerializer extends StdSerializer<String>
25+
{
26+
public MeaningOfLifeSerializer() { super(String.class); }
27+
28+
@Override
29+
public void serialize(String value, JsonGenerator gen,
30+
SerializerProvider provider) throws IOException {
31+
gen.writeNumber(42);
32+
}
33+
}
34+
35+
/*
36+
/**********************************************************************
37+
/* Test methods
38+
/**********************************************************************
39+
*/
40+
41+
public void testStringSerOverideNoAfterburner() throws Exception
42+
{
43+
final SimpleRO input = new SimpleRO();
44+
final String EXP = "{\"field\":42}";
45+
String json = new ObjectMapper()
46+
.registerModule(new SimpleModule("module", Version.unknownVersion())
47+
.addSerializer(String.class, new MeaningOfLifeSerializer()))
48+
.writeValueAsString(input);
49+
assertEquals(EXP, json);
50+
}
51+
52+
public void testStringSerOverideWithAfterburner() throws Exception
53+
{
54+
final SimpleRO input = new SimpleRO();
55+
final String EXP = "{\"field\":42}";
56+
String json = mapperWithModule()
57+
.registerModule(new SimpleModule("module", Version.unknownVersion())
58+
.addSerializer(String.class, new MeaningOfLifeSerializer()))
59+
.writeValueAsString(input);
60+
assertEquals(EXP, json);
61+
}
62+
}

0 commit comments

Comments
 (0)