Skip to content

Commit 59637ee

Browse files
committed
Support for Jackson's default typing via TypeResolverBuilder
Issue: SPR-13569
1 parent 155bbf5 commit 59637ee

File tree

2 files changed

+59
-33
lines changed

2 files changed

+59
-33
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
4545
import com.fasterxml.jackson.databind.SerializationFeature;
4646
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
47+
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
4748
import com.fasterxml.jackson.databind.module.SimpleModule;
4849
import com.fasterxml.jackson.databind.ser.FilterProvider;
4950
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
@@ -98,6 +99,8 @@ public class Jackson2ObjectMapperBuilder {
9899

99100
private PropertyNamingStrategy propertyNamingStrategy;
100101

102+
private TypeResolverBuilder<?> defaultTyping;
103+
101104
private JsonInclude.Include serializationInclusion;
102105

103106
private FilterProvider filters;
@@ -216,6 +219,15 @@ public Jackson2ObjectMapperBuilder propertyNamingStrategy(PropertyNamingStrategy
216219
return this;
217220
}
218221

222+
/**
223+
* Specify a {@link TypeResolverBuilder} to use for Jackson's default typing.
224+
* @since 4.2.2
225+
*/
226+
public Jackson2ObjectMapperBuilder defaultTyping(TypeResolverBuilder<?> typeResolverBuilder) {
227+
this.defaultTyping = typeResolverBuilder;
228+
return this;
229+
}
230+
219231
/**
220232
* Set a custom inclusion strategy for serialization.
221233
* @see com.fasterxml.jackson.annotation.JsonInclude.Include
@@ -523,6 +535,7 @@ public Jackson2ObjectMapperBuilder applicationContext(ApplicationContext applica
523535
return this;
524536
}
525537

538+
526539
/**
527540
* Build a new {@link ObjectMapper} instance.
528541
* <p>Each build operation produces an independent {@link ObjectMapper} instance.
@@ -588,6 +601,9 @@ else if (this.findWellKnownModules) {
588601
if (this.propertyNamingStrategy != null) {
589602
objectMapper.setPropertyNamingStrategy(this.propertyNamingStrategy);
590603
}
604+
if (this.defaultTyping != null) {
605+
objectMapper.setDefaultTyping(this.defaultTyping);
606+
}
591607
if (this.serializationInclusion != null) {
592608
objectMapper.setSerializationInclusion(this.serializationInclusion);
593609
}
@@ -623,6 +639,7 @@ else if (this.applicationContext != null) {
623639
}
624640
}
625641

642+
626643
// Any change to this method should be also applied to spring-jms and spring-messaging
627644
// MappingJackson2MessageConverter default constructors
628645
private void customizeDefaultFeatures(ObjectMapper objectMapper) {

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

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
3737
import com.fasterxml.jackson.databind.SerializationFeature;
3838
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
39+
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
3940
import com.fasterxml.jackson.databind.ser.FilterProvider;
4041
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
4142

@@ -215,6 +216,14 @@ public void setPropertyNamingStrategy(PropertyNamingStrategy propertyNamingStrat
215216
this.builder.propertyNamingStrategy(propertyNamingStrategy);
216217
}
217218

219+
/**
220+
* Specify a {@link TypeResolverBuilder} to use for Jackson's default typing.
221+
* @since 4.2.2
222+
*/
223+
public void setDefaultTyping(TypeResolverBuilder<?> typeResolverBuilder) {
224+
this.builder.defaultTyping(typeResolverBuilder);
225+
}
226+
218227
/**
219228
* Set a custom inclusion strategy for serialization.
220229
* @see com.fasterxml.jackson.annotation.JsonInclude.Include
@@ -223,6 +232,27 @@ public void setSerializationInclusion(JsonInclude.Include serializationInclusion
223232
this.builder.serializationInclusion(serializationInclusion);
224233
}
225234

235+
/**
236+
* Set the global filters to use in order to support {@link JsonFilter @JsonFilter} annotated POJO.
237+
* @since 4.2
238+
* @see Jackson2ObjectMapperBuilder#filters(FilterProvider)
239+
*/
240+
public void setFilters(FilterProvider filters) {
241+
this.builder.filters(filters);
242+
}
243+
244+
/**
245+
* Add mix-in annotations to use for augmenting specified class or interface.
246+
* @param mixIns Map of entries with target classes (or interface) whose annotations
247+
* to effectively override as key and mix-in classes (or interface) whose
248+
* annotations are to be "added" to target's annotations as value.
249+
* @since 4.1.2
250+
* @see com.fasterxml.jackson.databind.ObjectMapper#addMixInAnnotations(Class, Class)
251+
*/
252+
public void setMixIns(Map<Class<?>, Class<?>> mixIns) {
253+
this.builder.mixIns(mixIns);
254+
}
255+
226256
/**
227257
* Configure custom serializers. Each serializer is registered for the type
228258
* returned by {@link JsonSerializer#handledType()}, which must not be
@@ -248,18 +278,6 @@ public void setDeserializersByType(Map<Class<?>, JsonDeserializer<?>> deserializ
248278
this.builder.deserializersByType(deserializers);
249279
}
250280

251-
/**
252-
* Add mix-in annotations to use for augmenting specified class or interface.
253-
* @param mixIns Map of entries with target classes (or interface) whose annotations
254-
* to effectively override as key and mix-in classes (or interface) whose
255-
* annotations are to be "added" to target's annotations as value.
256-
* @since 4.1.2
257-
* @see com.fasterxml.jackson.databind.ObjectMapper#addMixInAnnotations(Class, Class)
258-
*/
259-
public void setMixIns(Map<Class<?>, Class<?>> mixIns) {
260-
this.builder.mixIns(mixIns);
261-
}
262-
263281
/**
264282
* Shortcut for {@link MapperFeature#AUTO_DETECT_FIELDS} option.
265283
*/
@@ -373,6 +391,11 @@ public void setFindModulesViaServiceLoader(boolean findModules) {
373391
this.builder.findModulesViaServiceLoader(findModules);
374392
}
375393

394+
@Override
395+
public void setBeanClassLoader(ClassLoader beanClassLoader) {
396+
this.builder.moduleClassLoader(beanClassLoader);
397+
}
398+
376399
/**
377400
* Customize the construction of Jackson handlers ({@link JsonSerializer}, {@link JsonDeserializer},
378401
* {@link KeyDeserializer}, {@code TypeResolverBuilder} and {@code TypeIdResolver}).
@@ -384,17 +407,15 @@ public void setHandlerInstantiator(HandlerInstantiator handlerInstantiator) {
384407
}
385408

386409
/**
387-
* Set the global filters to use in order to support {@link JsonFilter @JsonFilter} annotated POJO.
388-
* @since 4.2
389-
* @see Jackson2ObjectMapperBuilder#filters(FilterProvider)
410+
* Set the builder {@link ApplicationContext} in order to autowire Jackson handlers ({@link JsonSerializer},
411+
* {@link JsonDeserializer}, {@link KeyDeserializer}, {@code TypeResolverBuilder} and {@code TypeIdResolver}).
412+
* @since 4.1.3
413+
* @see Jackson2ObjectMapperBuilder#applicationContext(ApplicationContext)
414+
* @see SpringHandlerInstantiator
390415
*/
391-
public void setFilters(FilterProvider filters) {
392-
this.builder.filters(filters);
393-
}
394-
395416
@Override
396-
public void setBeanClassLoader(ClassLoader beanClassLoader) {
397-
this.builder.moduleClassLoader(beanClassLoader);
417+
public void setApplicationContext(ApplicationContext applicationContext) {
418+
this.builder.applicationContext(applicationContext);
398419
}
399420

400421

@@ -408,18 +429,6 @@ public void afterPropertiesSet() {
408429
}
409430
}
410431

411-
/**
412-
* Set the builder {@link ApplicationContext} in order to autowire Jackson handlers ({@link JsonSerializer},
413-
* {@link JsonDeserializer}, {@link KeyDeserializer}, {@code TypeResolverBuilder} and {@code TypeIdResolver}).
414-
* @since 4.1.3
415-
* @see Jackson2ObjectMapperBuilder#applicationContext(ApplicationContext)
416-
* @see SpringHandlerInstantiator
417-
*/
418-
@Override
419-
public void setApplicationContext(ApplicationContext applicationContext) {
420-
this.builder.applicationContext(applicationContext);
421-
}
422-
423432
/**
424433
* Return the singleton ObjectMapper.
425434
*/

0 commit comments

Comments
 (0)