Browse Source

Reordered Jackson initialization steps and restored HandlerInstantiator else block

pull/808/head
Juergen Hoeller 11 years ago
parent
commit
5f60d700a1
  1. 118
      spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java

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

@ -65,7 +65,7 @@ import org.springframework.util.StringUtils; @@ -65,7 +65,7 @@ import org.springframework.util.StringUtils;
* <p>Note that Jackson's JSR-310 and Joda-Time support modules will be registered automatically
* when available (and when Java 8 and Joda-Time themselves are available, respectively).
*
* <p>Tested against Jackson 2.2, 2.3 and 2.4; compatible with Jackson 2.0 and higher.
* <p>Tested against Jackson 2.2, 2.3, 2.4, 2.5, 2.6; compatible with Jackson 2.0 and higher.
*
* @author Sebastien Deleuze
* @author Juergen Hoeller
@ -91,12 +91,14 @@ public class Jackson2ObjectMapperBuilder { @@ -91,12 +91,14 @@ public class Jackson2ObjectMapperBuilder {
private JsonInclude.Include serializationInclusion;
private FilterProvider filters;
private final Map<Class<?>, Class<?>> mixIns = new HashMap<Class<?>, Class<?>>();
private final Map<Class<?>, JsonSerializer<?>> serializers = new LinkedHashMap<Class<?>, JsonSerializer<?>>();
private final Map<Class<?>, JsonDeserializer<?>> deserializers = new LinkedHashMap<Class<?>, JsonDeserializer<?>>();
private final Map<Class<?>, Class<?>> mixIns = new HashMap<Class<?>, Class<?>>();
private final Map<Object, Boolean> features = new HashMap<Object, Boolean>();
private List<Module> modules;
@ -111,8 +113,6 @@ public class Jackson2ObjectMapperBuilder { @@ -111,8 +113,6 @@ public class Jackson2ObjectMapperBuilder {
private HandlerInstantiator handlerInstantiator;
private FilterProvider filters;
private ApplicationContext applicationContext;
@ -216,6 +216,46 @@ public class Jackson2ObjectMapperBuilder { @@ -216,6 +216,46 @@ public class Jackson2ObjectMapperBuilder {
return this;
}
/**
* Set the global filters to use in order to support {@link JsonFilter @JsonFilter} annotated POJO.
* @since 4.2
* @see MappingJacksonValue#setFilters(FilterProvider)
*/
public Jackson2ObjectMapperBuilder filters(FilterProvider filters) {
this.filters = filters;
return this;
}
/**
* Add mix-in annotations to use for augmenting specified class or interface.
* @param target class (or interface) whose annotations to effectively override
* @param mixinSource class (or interface) whose annotations are to be "added"
* to target's annotations as value
* @since 4.1.2
* @see com.fasterxml.jackson.databind.ObjectMapper#addMixInAnnotations(Class, Class)
*/
public Jackson2ObjectMapperBuilder mixIn(Class<?> target, Class<?> mixinSource) {
if (mixinSource != null) {
this.mixIns.put(target, mixinSource);
}
return this;
}
/**
* Add mix-in annotations to use for augmenting specified class or interface.
* @param mixIns Map of entries with target classes (or interface) whose annotations
* to effectively override as key and mix-in classes (or interface) whose
* annotations are to be "added" to target's annotations as value.
* @since 4.1.2
* @see com.fasterxml.jackson.databind.ObjectMapper#addMixInAnnotations(Class, Class)
*/
public Jackson2ObjectMapperBuilder mixIns(Map<Class<?>, Class<?>> mixIns) {
if (mixIns != null) {
this.mixIns.putAll(mixIns);
}
return this;
}
/**
* Configure custom serializers. Each serializer is registered for the type
* returned by {@link JsonSerializer#handledType()}, which must not be
@ -241,7 +281,7 @@ public class Jackson2ObjectMapperBuilder { @@ -241,7 +281,7 @@ public class Jackson2ObjectMapperBuilder {
* @since 4.1.2
*/
public Jackson2ObjectMapperBuilder serializerByType(Class<?> type, JsonSerializer<?> serializer) {
if (serializers != null) {
if (serializer != null) {
this.serializers.put(type, serializer);
}
return this;
@ -263,7 +303,7 @@ public class Jackson2ObjectMapperBuilder { @@ -263,7 +303,7 @@ public class Jackson2ObjectMapperBuilder {
* @since 4.1.2
*/
public Jackson2ObjectMapperBuilder deserializerByType(Class<?> type, JsonDeserializer<?> deserializer) {
if (deserializers != null) {
if (deserializer != null) {
this.deserializers.put(type, deserializer);
}
return this;
@ -279,36 +319,6 @@ public class Jackson2ObjectMapperBuilder { @@ -279,36 +319,6 @@ public class Jackson2ObjectMapperBuilder {
return this;
}
/**
* Add mix-in annotations to use for augmenting specified class or interface.
* @param target class (or interface) whose annotations to effectively override
* @param mixinSource class (or interface) whose annotations are to be "added"
* to target's annotations as value
* @since 4.1.2
* @see com.fasterxml.jackson.databind.ObjectMapper#addMixInAnnotations(Class, Class)
*/
public Jackson2ObjectMapperBuilder mixIn(Class<?> target, Class<?> mixinSource) {
if (mixinSource != null) {
this.mixIns.put(target, mixinSource);
}
return this;
}
/**
* Add mix-in annotations to use for augmenting specified class or interface.
* @param mixIns Map of entries with target classes (or interface) whose annotations
* to effectively override as key and mix-in classes (or interface) whose
* annotations are to be "added" to target's annotations as value.
* @since 4.1.2
* @see com.fasterxml.jackson.databind.ObjectMapper#addMixInAnnotations(Class, Class)
*/
public Jackson2ObjectMapperBuilder mixIns(Map<Class<?>, Class<?>> mixIns) {
if (mixIns != null) {
this.mixIns.putAll(mixIns);
}
return this;
}
/**
* Shortcut for {@link MapperFeature#AUTO_DETECT_FIELDS} option.
*/
@ -490,16 +500,6 @@ public class Jackson2ObjectMapperBuilder { @@ -490,16 +500,6 @@ public class Jackson2ObjectMapperBuilder {
return this;
}
/**
* Set the global filters to use in order to support {@link JsonFilter @JsonFilter} annotated POJO.
* @since 4.2
* @see MappingJacksonValue#setFilters(FilterProvider)
*/
public Jackson2ObjectMapperBuilder filters(FilterProvider filters) {
this.filters = filters;
return this;
}
/**
* Set the Spring {@link ApplicationContext} in order to autowire Jackson handlers ({@link JsonSerializer},
* {@link JsonDeserializer}, {@link KeyDeserializer}, {@code TypeResolverBuilder} and {@code TypeIdResolver}).
@ -580,11 +580,23 @@ public class Jackson2ObjectMapperBuilder { @@ -580,11 +580,23 @@ public class Jackson2ObjectMapperBuilder {
if (this.annotationIntrospector != null) {
objectMapper.setAnnotationIntrospector(this.annotationIntrospector);
}
if (this.propertyNamingStrategy != null) {
objectMapper.setPropertyNamingStrategy(this.propertyNamingStrategy);
}
if (this.serializationInclusion != null) {
objectMapper.setSerializationInclusion(this.serializationInclusion);
}
if (this.filters != null) {
// Deprecated as of Jackson 2.6, but just in favor of a fluent variant.
objectMapper.setFilters(this.filters);
}
for (Class<?> target : this.mixIns.keySet()) {
// Deprecated as of Jackson 2.5, but just in favor of a fluent variant.
objectMapper.addMixInAnnotations(target, this.mixIns.get(target));
}
if (!this.serializers.isEmpty() || !this.deserializers.isEmpty()) {
SimpleModule module = new SimpleModule();
addSerializers(module);
@ -597,19 +609,9 @@ public class Jackson2ObjectMapperBuilder { @@ -597,19 +609,9 @@ public class Jackson2ObjectMapperBuilder {
configureFeature(objectMapper, feature, this.features.get(feature));
}
if (this.propertyNamingStrategy != null) {
objectMapper.setPropertyNamingStrategy(this.propertyNamingStrategy);
}
for (Class<?> target : this.mixIns.keySet()) {
// Deprecated as of Jackson 2.5, but just in favor of a fluent variant.
objectMapper.addMixInAnnotations(target, this.mixIns.get(target));
}
if (this.handlerInstantiator != null) {
objectMapper.setHandlerInstantiator(this.handlerInstantiator);
}
if (this.filters != null) {
objectMapper.setFilters(this.filters);
}
else if (this.applicationContext != null) {
objectMapper.setHandlerInstantiator(
new SpringHandlerInstantiator(this.applicationContext.getAutowireCapableBeanFactory()));

Loading…
Cancel
Save