Skip to content

Commit 499fa34

Browse files
authored
Merge pull request #471 from msgpack/fix-msgpack-jackson-copy
Fix NPE at ObjectMapper#copy with MessagePackFactory
2 parents 1447f8f + 2b6487f commit 499fa34

File tree

2 files changed

+70
-21
lines changed

2 files changed

+70
-21
lines changed

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ public MessagePackFactory(MessagePackFactory src)
5858
this.packerConfig = src.packerConfig.clone();
5959
this.reuseResourceInGenerator = src.reuseResourceInGenerator;
6060
this.reuseResourceInParser = src.reuseResourceInParser;
61-
this.extTypeCustomDesers = new ExtensionTypeCustomDeserializers(src.extTypeCustomDesers);
61+
if (src.extTypeCustomDesers != null) {
62+
this.extTypeCustomDesers = new ExtensionTypeCustomDeserializers(src.extTypeCustomDesers);
63+
}
6264
}
6365

6466
public MessagePackFactory setReuseResourceInGenerator(boolean reuseResourceInGenerator)

msgpack-jackson/src/test/java/org/msgpack/jackson/dataformat/MessagePackFactoryTest.java

Lines changed: 67 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.fasterxml.jackson.core.type.TypeReference;
2323
import com.fasterxml.jackson.databind.AnnotationIntrospector;
2424
import com.fasterxml.jackson.databind.ObjectMapper;
25+
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
2526
import org.junit.Test;
2627
import org.msgpack.core.MessagePack;
2728

@@ -57,47 +58,93 @@ public void testCreateParser()
5758
assertEquals(MessagePackParser.class, parser.getClass());
5859
}
5960

60-
@Test
61-
public void copy()
61+
private void assertCopy(boolean advancedConfig)
6262
throws IOException
6363
{
64-
ExtensionTypeCustomDeserializers extTypeCustomDesers = new ExtensionTypeCustomDeserializers();
65-
extTypeCustomDesers.addTargetClass((byte) 42, TinyPojo.class);
64+
// Build base ObjectMapper
65+
ObjectMapper objectMapper;
66+
if (advancedConfig) {
67+
ExtensionTypeCustomDeserializers extTypeCustomDesers = new ExtensionTypeCustomDeserializers();
68+
extTypeCustomDesers.addTargetClass((byte) 42, TinyPojo.class);
69+
70+
MessagePack.PackerConfig msgpackPackerConfig = new MessagePack.PackerConfig().withStr8FormatSupport(false);
6671

67-
MessagePack.PackerConfig msgpackPackerConfig = new MessagePack.PackerConfig().withStr8FormatSupport(false);
72+
MessagePackFactory messagePackFactory = new MessagePackFactory(msgpackPackerConfig);
73+
messagePackFactory.setExtTypeCustomDesers(extTypeCustomDesers);
6874

69-
MessagePackFactory messagePackFactory = new MessagePackFactory(msgpackPackerConfig);
70-
messagePackFactory.setExtTypeCustomDesers(extTypeCustomDesers);
75+
objectMapper = new ObjectMapper(messagePackFactory);
7176

72-
ObjectMapper objectMapper = new ObjectMapper(messagePackFactory);
77+
objectMapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
78+
objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
7379

74-
objectMapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
75-
objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
80+
objectMapper.setAnnotationIntrospector(new JsonArrayFormat());
81+
}
82+
else {
83+
MessagePackFactory messagePackFactory = new MessagePackFactory();
84+
objectMapper = new ObjectMapper(messagePackFactory);
85+
}
7686

77-
objectMapper.setAnnotationIntrospector(new JsonArrayFormat());
87+
// Use the original ObjectMapper in advance
88+
{
89+
byte[] bytes = objectMapper.writeValueAsBytes(1234);
90+
assertThat(objectMapper.readValue(bytes, Integer.class), is(1234));
91+
}
7892

93+
// Copy the ObjectMapper
7994
ObjectMapper copiedObjectMapper = objectMapper.copy();
95+
96+
// Assert the copied ObjectMapper
8097
JsonFactory copiedFactory = copiedObjectMapper.getFactory();
8198
assertThat(copiedFactory, is(instanceOf(MessagePackFactory.class)));
8299
MessagePackFactory copiedMessagePackFactory = (MessagePackFactory) copiedFactory;
83100

84-
assertThat(copiedMessagePackFactory.getPackerConfig().isStr8FormatSupport(), is(false));
101+
Collection<AnnotationIntrospector> annotationIntrospectors =
102+
copiedObjectMapper.getSerializationConfig().getAnnotationIntrospector().allIntrospectors();
103+
assertThat(annotationIntrospectors.size(), is(1));
85104

86-
assertThat(copiedMessagePackFactory.getExtTypeCustomDesers().getDeser((byte) 42), is(notNullValue()));
87-
assertThat(copiedMessagePackFactory.getExtTypeCustomDesers().getDeser((byte) 43), is(nullValue()));
105+
if (advancedConfig) {
106+
assertThat(copiedMessagePackFactory.getPackerConfig().isStr8FormatSupport(), is(false));
88107

89-
assertThat(copiedMessagePackFactory.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET), is(false));
90-
assertThat(copiedMessagePackFactory.isEnabled(JsonParser.Feature.AUTO_CLOSE_SOURCE), is(false));
108+
assertThat(copiedMessagePackFactory.getExtTypeCustomDesers().getDeser((byte) 42), is(notNullValue()));
109+
assertThat(copiedMessagePackFactory.getExtTypeCustomDesers().getDeser((byte) 43), is(nullValue()));
91110

92-
Collection<AnnotationIntrospector> annotationIntrospectors = copiedObjectMapper.getSerializationConfig().getAnnotationIntrospector().allIntrospectors();
93-
assertThat(annotationIntrospectors.size(), is(1));
94-
assertThat(annotationIntrospectors.stream().findFirst().get(), is(instanceOf(JsonArrayFormat.class)));
111+
assertThat(copiedMessagePackFactory.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET), is(false));
112+
assertThat(copiedMessagePackFactory.isEnabled(JsonParser.Feature.AUTO_CLOSE_SOURCE), is(false));
95113

96-
HashMap<String, Integer> map = new HashMap<>();
114+
assertThat(annotationIntrospectors.stream().findFirst().get(), is(instanceOf(JsonArrayFormat.class)));
115+
}
116+
else {
117+
assertThat(copiedMessagePackFactory.getPackerConfig().isStr8FormatSupport(), is(true));
118+
119+
assertThat(copiedMessagePackFactory.getExtTypeCustomDesers(), is(nullValue()));
120+
121+
assertThat(copiedMessagePackFactory.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET), is(true));
122+
assertThat(copiedMessagePackFactory.isEnabled(JsonParser.Feature.AUTO_CLOSE_SOURCE), is(true));
123+
124+
assertThat(annotationIntrospectors.stream().findFirst().get(),
125+
is(instanceOf(JacksonAnnotationIntrospector.class)));
126+
}
127+
128+
// Check the copied ObjectMapper works fine
129+
Map<String, Integer> map = new HashMap<>();
97130
map.put("one", 1);
98131
Map<String, Integer> deserialized = copiedObjectMapper
99132
.readValue(objectMapper.writeValueAsBytes(map), new TypeReference<Map<String, Integer>>() {});
100133
assertThat(deserialized.size(), is(1));
101134
assertThat(deserialized.get("one"), is(1));
102135
}
136+
137+
@Test
138+
public void copyWithDefaultConfig()
139+
throws IOException
140+
{
141+
assertCopy(false);
142+
}
143+
144+
@Test
145+
public void copyWithAdvancedConfig()
146+
throws IOException
147+
{
148+
assertCopy(true);
149+
}
103150
}

0 commit comments

Comments
 (0)