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

Commit e4c9f7c

Browse files
committed
try to fix custom deserializer for Optional
1 parent fcf91b3 commit e4c9f7c

File tree

2 files changed

+68
-11
lines changed

2 files changed

+68
-11
lines changed

src/main/java/com/fasterxml/jackson/datatype/jdk8/Jdk8Deserializers.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,19 @@
1717
class Jdk8Deserializers extends Deserializers.Base
1818
{
1919
@Override
20-
public JsonDeserializer<?> findBeanDeserializer(JavaType type, DeserializationConfig config, BeanDescription beanDesc)
21-
throws JsonMappingException
20+
public JsonDeserializer<?> findBeanDeserializer(JavaType type,
21+
DeserializationConfig config, BeanDescription beanDesc)
22+
throws JsonMappingException
2223
{
2324
final Class<?> raw = type.getRawClass();
2425
if (raw == Optional.class) {
2526
JavaType[] types = config.getTypeFactory().findTypeParameters(type, Optional.class);
2627
JavaType refType = (types == null) ? TypeFactory.unknownType() : types[0];
27-
JsonDeserializer<?> valueDeser = type.getValueHandler();
28-
TypeDeserializer typeDeser = type.getTypeHandler();
29-
// [jackson-datatype-guava:Issue#42]: Polymorphic types need type deserializer
28+
JsonDeserializer<?> valueDeser = refType.getValueHandler();
29+
TypeDeserializer typeDeser = refType.getTypeHandler();
30+
// [jackson-datatype#42]: Polymorphic types need type deserializer
3031
if (typeDeser == null) {
31-
try {
32-
typeDeser = config.findTypeDeserializer(refType);
33-
} catch (NoSuchMethodError e) { // Running on Jackson 2.3.x, remove this ugly hack once we drop support
34-
typeDeser = null;
35-
}
32+
typeDeser = config.findTypeDeserializer(refType);
3633
}
3734
return new OptionalDeserializer(type, refType, typeDeser, valueDeser);
3835
}

src/test/java/com/fasterxml/jackson/datatype/jdk8/OptionalTest.java

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,19 @@
44
import java.util.*;
55

66
import com.fasterxml.jackson.annotation.*;
7+
8+
import com.fasterxml.jackson.core.JsonGenerator;
9+
import com.fasterxml.jackson.core.JsonParser;
10+
import com.fasterxml.jackson.core.JsonProcessingException;
711
import com.fasterxml.jackson.core.type.TypeReference;
12+
13+
import com.fasterxml.jackson.databind.DeserializationContext;
814
import com.fasterxml.jackson.databind.ObjectMapper;
15+
import com.fasterxml.jackson.databind.SerializerProvider;
16+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
17+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
18+
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
19+
import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer;
920

1021
public class OptionalTest extends ModuleTestBase
1122
{
@@ -92,6 +103,39 @@ public BooleanBean(Boolean b) {
92103
}
93104
}
94105

106+
static class CaseChangingStringWrapper {
107+
@JsonSerialize(contentUsing=UpperCasingSerializer.class)
108+
@JsonDeserialize(contentUsing=LowerCasingDeserializer.class)
109+
public Optional<String> value;
110+
111+
CaseChangingStringWrapper() { }
112+
public CaseChangingStringWrapper(String s) { value = Optional.ofNullable(s); }
113+
}
114+
115+
@SuppressWarnings("serial")
116+
public static class UpperCasingSerializer extends StdScalarSerializer<String>
117+
{
118+
public UpperCasingSerializer() { super(String.class); }
119+
120+
@Override
121+
public void serialize(String value, JsonGenerator gen,
122+
SerializerProvider provider) throws IOException {
123+
gen.writeString(value.toUpperCase());
124+
}
125+
}
126+
127+
@SuppressWarnings("serial")
128+
public static class LowerCasingDeserializer extends StdScalarDeserializer<String>
129+
{
130+
public LowerCasingDeserializer() { super(String.class); }
131+
132+
@Override
133+
public String deserialize(JsonParser p, DeserializationContext ctxt)
134+
throws IOException, JsonProcessingException {
135+
return p.getText().toLowerCase();
136+
}
137+
}
138+
95139
private ObjectMapper MAPPER;
96140

97141
@Override
@@ -249,7 +293,23 @@ public void testBoolean() throws Exception
249293
assertNotNull(b.value);
250294
assertFalse(b.value.isPresent());
251295
}
252-
296+
297+
/*
298+
public void testWithCustomDeserializer() throws Exception
299+
{
300+
CaseChangingStringWrapper w = MAPPER.readValue(aposToQuotes("{'value':'FoobaR'}"),
301+
CaseChangingStringWrapper.class);
302+
assertEquals("foobar", w.value.get());
303+
}
304+
*/
305+
306+
public void testCustomSerializer() throws Exception
307+
{
308+
final String VALUE = "fooBAR";
309+
String json = MAPPER.writeValueAsString(new CaseChangingStringWrapper(VALUE));
310+
assertEquals(json, aposToQuotes("{'value':'FOOBAR'}"));
311+
}
312+
253313
/*
254314
/**********************************************************
255315
/* Helper methods

0 commit comments

Comments
 (0)