Browse Source

Option for advanced ObjectMapper customization

Closes gh-23017
pull/25078/head
Rossen Stoyanchev 6 years ago
parent
commit
e88eb0ecf7
  1. 21
      spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java
  2. 15
      spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java

21
spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java

@ -26,6 +26,7 @@ import java.util.List; @@ -26,6 +26,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.function.Consumer;
import java.util.function.Function;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
@ -169,6 +170,9 @@ public class Jackson2ObjectMapperBuilder { @@ -169,6 +170,9 @@ public class Jackson2ObjectMapperBuilder {
@Nullable
private Boolean defaultUseWrapper;
@Nullable
private Consumer<ObjectMapper> configurer;
/**
* If set to {@code true}, an {@link XmlMapper} will be created using its
@ -639,6 +643,19 @@ public class Jackson2ObjectMapperBuilder { @@ -639,6 +643,19 @@ public class Jackson2ObjectMapperBuilder {
return this;
}
/**
* An option to apply additional customizations directly to the
* {@code ObjectMapper} instances at the end, after all other config
* properties of the builder have been applied.
* @param configurer a configurer to apply; if invoked multiple times, all
* configurers are applied in the same order.
* @since 5.3
*/
public Jackson2ObjectMapperBuilder postConfigurer(Consumer<ObjectMapper> configurer) {
this.configurer = (this.configurer != null ? this.configurer.andThen(configurer) : configurer);
return this;
}
/**
* Build a new {@link ObjectMapper} instance.
@ -740,6 +757,10 @@ public class Jackson2ObjectMapperBuilder { @@ -740,6 +757,10 @@ public class Jackson2ObjectMapperBuilder {
objectMapper.setHandlerInstantiator(
new SpringHandlerInstantiator(this.applicationContext.getAutowireCapableBeanFactory()));
}
if (this.configurer != null) {
this.configurer.accept(objectMapper);
}
}
private void registerModule(Module module, MultiValueMap<Object, Module> modulesToRegister) {

15
spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java

@ -62,6 +62,7 @@ import com.fasterxml.jackson.databind.deser.BasicDeserializerFactory; @@ -62,6 +62,7 @@ import com.fasterxml.jackson.databind.deser.BasicDeserializerFactory;
import com.fasterxml.jackson.databind.deser.Deserializers;
import com.fasterxml.jackson.databind.deser.std.DateDeserializers;
import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.module.SimpleSerializers;
@ -431,6 +432,20 @@ public class Jackson2ObjectMapperBuilderTests { @@ -431,6 +432,20 @@ public class Jackson2ObjectMapperBuilderTests {
assertThat(output).doesNotContain("value2");
}
@Test // gh-23017
public void postConfigurer() {
JacksonAnnotationIntrospector introspector1 = new JacksonAnnotationIntrospector();
JacksonAnnotationIntrospector introspector2 = new JacksonAnnotationIntrospector();
ObjectMapper mapper = Jackson2ObjectMapperBuilder.json()
.postConfigurer(m -> m.setAnnotationIntrospectors(introspector1, introspector2))
.build();
assertThat(mapper.getSerializationConfig().getAnnotationIntrospector()).isSameAs(introspector1);
assertThat(mapper.getDeserializationConfig().getAnnotationIntrospector()).isSameAs(introspector2);
}
@Test
public void completeSetup() throws JsonMappingException {
NopAnnotationIntrospector introspector = NopAnnotationIntrospector.instance;

Loading…
Cancel
Save