Skip to content

Commit 1dfc0ff

Browse files
committed
SpringHandlerInstantiator supports all HandlerInstantiator-provided factory methods
Issue: SPR-14347
1 parent d51c22a commit 1dfc0ff

File tree

1 file changed

+66
-21
lines changed

1 file changed

+66
-21
lines changed
Lines changed: 66 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,30 +16,42 @@
1616

1717
package org.springframework.http.converter.json;
1818

19+
import com.fasterxml.jackson.annotation.ObjectIdGenerator;
20+
import com.fasterxml.jackson.annotation.ObjectIdResolver;
1921
import com.fasterxml.jackson.databind.DeserializationConfig;
2022
import com.fasterxml.jackson.databind.JsonDeserializer;
2123
import com.fasterxml.jackson.databind.JsonSerializer;
2224
import com.fasterxml.jackson.databind.KeyDeserializer;
25+
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
2326
import com.fasterxml.jackson.databind.SerializationConfig;
2427
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
2528
import com.fasterxml.jackson.databind.cfg.MapperConfig;
29+
import com.fasterxml.jackson.databind.deser.ValueInstantiator;
2630
import com.fasterxml.jackson.databind.introspect.Annotated;
2731
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
2832
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
33+
import com.fasterxml.jackson.databind.ser.VirtualBeanPropertyWriter;
34+
import com.fasterxml.jackson.databind.util.Converter;
2935

3036
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
3137
import org.springframework.context.ApplicationContext;
3238
import org.springframework.util.Assert;
3339

3440
/**
35-
* Eventually get Jackson handler ({@link JsonSerializer}, {@link JsonDeserializer},
36-
* {@link KeyDeserializer}, {@link TypeResolverBuilder}, {@link TypeIdResolver}) beans by
37-
* type from Spring {@link ApplicationContext}. If no bean is found, the default behavior
38-
* happen (calling no-argument constructor via reflection).
41+
* Allows for creating Jackson ({@link JsonSerializer}, {@link JsonDeserializer},
42+
* {@link KeyDeserializer}, {@link TypeResolverBuilder}, {@link TypeIdResolver})
43+
* beans with autowiring against a Spring {@link ApplicationContext}.
44+
*
45+
* <p>As of Spring 4.3, this overrides all factory methods in {@link HandlerInstantiator},
46+
* including non-abstract ones and recently introduced ones from Jackson 2.4 and 2.5:
47+
* for {@link ValueInstantiator}, {@link ObjectIdGenerator}, {@link ObjectIdResolver},
48+
* {@link PropertyNamingStrategy}, {@link Converter}, {@link VirtualBeanPropertyWriter}.
3949
*
40-
* @since 4.1.3
4150
* @author Sebastien Deleuze
51+
* @author Juergen Hoeller
52+
* @since 4.1.3
4253
* @see Jackson2ObjectMapperBuilder#handlerInstantiator(HandlerInstantiator)
54+
* @see ApplicationContext#getAutowireCapableBeanFactory()
4355
* @see HandlerInstantiator
4456
*/
4557
public class SpringHandlerInstantiator extends HandlerInstantiator {
@@ -56,33 +68,66 @@ public SpringHandlerInstantiator(AutowireCapableBeanFactory beanFactory) {
5668
this.beanFactory = beanFactory;
5769
}
5870

71+
72+
@Override
73+
public JsonDeserializer<?> deserializerInstance(DeserializationConfig config, Annotated annotated, Class<?> implClass) {
74+
return (JsonDeserializer<?>) this.beanFactory.createBean(implClass);
75+
}
76+
77+
@Override
78+
public KeyDeserializer keyDeserializerInstance(DeserializationConfig config, Annotated annotated, Class<?> implClass) {
79+
return (KeyDeserializer) this.beanFactory.createBean(implClass);
80+
}
81+
5982
@Override
60-
public JsonSerializer<?> serializerInstance(SerializationConfig config,
61-
Annotated annotated, Class<?> keyDeserClass) {
62-
return (JsonSerializer<?>) this.beanFactory.createBean(keyDeserClass);
83+
public JsonSerializer<?> serializerInstance(SerializationConfig config, Annotated annotated, Class<?> implClass) {
84+
return (JsonSerializer<?>) this.beanFactory.createBean(implClass);
6385
}
6486

6587
@Override
66-
public JsonDeserializer<?> deserializerInstance(DeserializationConfig config,
67-
Annotated annotated, Class<?> deserClass) {
68-
return (JsonDeserializer<?>) this.beanFactory.createBean(deserClass);
88+
public TypeResolverBuilder<?> typeResolverBuilderInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
89+
return (TypeResolverBuilder<?>) this.beanFactory.createBean(implClass);
6990
}
7091

7192
@Override
72-
public KeyDeserializer keyDeserializerInstance(DeserializationConfig config,
73-
Annotated annotated, Class<?> serClass) {
74-
return (KeyDeserializer) this.beanFactory.createBean(serClass);
93+
public TypeIdResolver typeIdResolverInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
94+
return (TypeIdResolver) this.beanFactory.createBean(implClass);
7595
}
7696

97+
/** @since 4.3 */
7798
@Override
78-
public TypeResolverBuilder<?> typeResolverBuilderInstance(MapperConfig<?> config,
79-
Annotated annotated, Class<?> resolverClass) {
80-
return (TypeResolverBuilder<?>) this.beanFactory.createBean(resolverClass);
99+
public ValueInstantiator valueInstantiatorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
100+
return (ValueInstantiator) this.beanFactory.createBean(implClass);
81101
}
82102

103+
/** @since 4.3 */
83104
@Override
84-
public TypeIdResolver typeIdResolverInstance(MapperConfig<?> config,
85-
Annotated annotated, Class<?> resolverClass) {
86-
return (TypeIdResolver) this.beanFactory.createBean(resolverClass);
105+
public ObjectIdGenerator<?> objectIdGeneratorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
106+
return (ObjectIdGenerator<?>) this.beanFactory.createBean(implClass);
87107
}
108+
109+
/** @since 4.3 */
110+
@Override
111+
public ObjectIdResolver resolverIdGeneratorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
112+
return (ObjectIdResolver) this.beanFactory.createBean(implClass);
113+
}
114+
115+
/** @since 4.3 */
116+
@Override
117+
public PropertyNamingStrategy namingStrategyInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
118+
return (PropertyNamingStrategy) this.beanFactory.createBean(implClass);
119+
}
120+
121+
/** @since 4.3 */
122+
@Override
123+
public Converter<?, ?> converterInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) {
124+
return (Converter<?, ?>) this.beanFactory.createBean(implClass);
125+
}
126+
127+
/** @since 4.3 */
128+
@Override
129+
public VirtualBeanPropertyWriter virtualPropertyWriterInstance(MapperConfig<?> config, Class<?> implClass) {
130+
return (VirtualBeanPropertyWriter) this.beanFactory.createBean(implClass);
131+
}
132+
88133
}

0 commit comments

Comments
 (0)