Skip to content

Commit 59f0de5

Browse files
Implementation for "Provide method ObjectMapper.copyWith(JsonFactory)" Closes #3212 (#3626)
1 parent 5f4f31a commit 59f0de5

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,12 @@ public ObjectMapper(JsonFactory jf) {
592592
*/
593593
protected ObjectMapper(ObjectMapper src)
594594
{
595-
_jsonFactory = src._jsonFactory.copy();
595+
this(src, null);
596+
}
597+
598+
protected ObjectMapper(ObjectMapper src, JsonFactory factory)
599+
{
600+
_jsonFactory = factory != null ? factory : src._jsonFactory.copy();
596601
_jsonFactory.setCodec(this);
597602
_subtypeResolver = src._subtypeResolver.copy();
598603
_typeFactory = src._typeFactory;
@@ -603,10 +608,10 @@ protected ObjectMapper(ObjectMapper src)
603608

604609
RootNameLookup rootNames = new RootNameLookup();
605610
_serializationConfig = new SerializationConfig(src._serializationConfig,
606-
_subtypeResolver, _mixIns, rootNames, _configOverrides);
611+
_subtypeResolver, _mixIns, rootNames, _configOverrides);
607612
_deserializationConfig = new DeserializationConfig(src._deserializationConfig,
608-
_subtypeResolver, _mixIns, rootNames, _configOverrides,
609-
_coercionConfigs);
613+
_subtypeResolver, _mixIns, rootNames, _configOverrides,
614+
_coercionConfigs);
610615
_serializerProvider = src._serializerProvider.copy();
611616
_deserializationContext = src._deserializationContext.copy();
612617

@@ -715,6 +720,11 @@ public ObjectMapper copy() {
715720
return new ObjectMapper(this);
716721
}
717722

723+
public ObjectMapper copyWith(JsonFactory factory) {
724+
_checkInvalidCopy(ObjectMapper.class);
725+
return new ObjectMapper(this, factory);
726+
}
727+
718728
/**
719729
* @since 2.1
720730
*/
@@ -1141,6 +1151,7 @@ public ObjectMapper findAndRegisterModules() {
11411151
return registerModules(findModules());
11421152
}
11431153

1154+
11441155
/*
11451156
/**********************************************************
11461157
/* Factory methods for creating JsonGenerators (added in 2.11)

src/test/java/com/fasterxml/jackson/databind/ObjectMapperTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,46 @@ public void testCopyOfSubtypeResolver2785() throws Exception {
204204
assertNotNull(result);
205205
}
206206

207+
public void testCopyWith() throws JsonProcessingException {
208+
ObjectMapper mapper = new ObjectMapper();
209+
//configuring some settings to non-defaults
210+
mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);
211+
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
212+
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
213+
mapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, true);
214+
JsonFactory newFactory = JsonFactory.builder()
215+
.configure(JsonFactory.Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING, false)
216+
.build();
217+
ObjectMapper copiedMapper = mapper.copyWith(newFactory);
218+
String json = "{ \"color\" : \"Black\", \"free\" : \"true\", \"pages\" : \"204.04\" }";
219+
JsonNode readResult = copiedMapper.readTree(json);
220+
//validate functionality
221+
assertEquals("Black", readResult.get("color").asText());
222+
assertEquals(true, readResult.get("free").asBoolean());
223+
assertEquals(204, readResult.get("pages").asInt());
224+
String readResultAsString = "{\n \"color\" : \"Black\",\n \"free\" : \"true\",\n \"pages\" : \"204.04\"\n}";
225+
System.out.println(mapper.writeValueAsString(readResult));
226+
assertEquals(readResultAsString, mapper.writeValueAsString(readResult));
227+
228+
//validate properties
229+
Boolean mapperConfig1 = mapper._deserializationConfig.isEnabled(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);
230+
Boolean copiedMapperConfig1 = copiedMapper._deserializationConfig.isEnabled(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);
231+
Boolean mapperConfig2 = mapper._deserializationConfig.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
232+
Boolean copiedMapperConfig2 = copiedMapper._deserializationConfig.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
233+
Boolean mapperConfig3 = mapper._serializationConfig.isEnabled(SerializationFeature.INDENT_OUTPUT);
234+
Boolean copiedMapperConfig3 = copiedMapper._serializationConfig.isEnabled(SerializationFeature.INDENT_OUTPUT);
235+
Boolean mapperConfig4 = mapper._serializationConfig.isEnabled(SerializationFeature.FAIL_ON_SELF_REFERENCES);
236+
Boolean copiedMapperConfig4 = copiedMapper._serializationConfig.isEnabled(SerializationFeature.FAIL_ON_SELF_REFERENCES);
237+
assertNotSame(mapper.getFactory(), copiedMapper.getFactory());
238+
assertSame(mapperConfig1, copiedMapperConfig1);
239+
assertSame(mapperConfig2, copiedMapperConfig2);
240+
assertSame(mapperConfig3, copiedMapperConfig3);
241+
assertSame(mapperConfig4, copiedMapperConfig4);
242+
assertNotSame(mapper.getFactory().isEnabled(JsonFactory.Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING),
243+
copiedMapper.getFactory().isEnabled(JsonFactory.Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING)
244+
);
245+
}
246+
207247
public void testFailedCopy() throws Exception
208248
{
209249
NoCopyMapper src = new NoCopyMapper();

0 commit comments

Comments
 (0)