From 1dfc0ffd437ad5df791780cc8e9fc34b494011bb Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 9 Jun 2016 17:02:39 +0200 Subject: [PATCH] SpringHandlerInstantiator supports all HandlerInstantiator-provided factory methods Issue: SPR-14347 --- .../json/SpringHandlerInstantiator.java | 87 ++++++++++++++----- 1 file changed, 66 insertions(+), 21 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java b/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java index ef7446aede..ad4874c119 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/SpringHandlerInstantiator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,30 +16,42 @@ package org.springframework.http.converter.json; +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; import com.fasterxml.jackson.databind.DeserializationConfig; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.KeyDeserializer; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.cfg.HandlerInstantiator; import com.fasterxml.jackson.databind.cfg.MapperConfig; +import com.fasterxml.jackson.databind.deser.ValueInstantiator; import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.jsontype.TypeIdResolver; import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder; +import com.fasterxml.jackson.databind.ser.VirtualBeanPropertyWriter; +import com.fasterxml.jackson.databind.util.Converter; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.util.Assert; /** - * Eventually get Jackson handler ({@link JsonSerializer}, {@link JsonDeserializer}, - * {@link KeyDeserializer}, {@link TypeResolverBuilder}, {@link TypeIdResolver}) beans by - * type from Spring {@link ApplicationContext}. If no bean is found, the default behavior - * happen (calling no-argument constructor via reflection). + * Allows for creating Jackson ({@link JsonSerializer}, {@link JsonDeserializer}, + * {@link KeyDeserializer}, {@link TypeResolverBuilder}, {@link TypeIdResolver}) + * beans with autowiring against a Spring {@link ApplicationContext}. + * + *

As of Spring 4.3, this overrides all factory methods in {@link HandlerInstantiator}, + * including non-abstract ones and recently introduced ones from Jackson 2.4 and 2.5: + * for {@link ValueInstantiator}, {@link ObjectIdGenerator}, {@link ObjectIdResolver}, + * {@link PropertyNamingStrategy}, {@link Converter}, {@link VirtualBeanPropertyWriter}. * - * @since 4.1.3 * @author Sebastien Deleuze + * @author Juergen Hoeller + * @since 4.1.3 * @see Jackson2ObjectMapperBuilder#handlerInstantiator(HandlerInstantiator) + * @see ApplicationContext#getAutowireCapableBeanFactory() * @see HandlerInstantiator */ public class SpringHandlerInstantiator extends HandlerInstantiator { @@ -56,33 +68,66 @@ public class SpringHandlerInstantiator extends HandlerInstantiator { this.beanFactory = beanFactory; } + + @Override + public JsonDeserializer deserializerInstance(DeserializationConfig config, Annotated annotated, Class implClass) { + return (JsonDeserializer) this.beanFactory.createBean(implClass); + } + + @Override + public KeyDeserializer keyDeserializerInstance(DeserializationConfig config, Annotated annotated, Class implClass) { + return (KeyDeserializer) this.beanFactory.createBean(implClass); + } + @Override - public JsonSerializer serializerInstance(SerializationConfig config, - Annotated annotated, Class keyDeserClass) { - return (JsonSerializer) this.beanFactory.createBean(keyDeserClass); + public JsonSerializer serializerInstance(SerializationConfig config, Annotated annotated, Class implClass) { + return (JsonSerializer) this.beanFactory.createBean(implClass); } @Override - public JsonDeserializer deserializerInstance(DeserializationConfig config, - Annotated annotated, Class deserClass) { - return (JsonDeserializer) this.beanFactory.createBean(deserClass); + public TypeResolverBuilder typeResolverBuilderInstance(MapperConfig config, Annotated annotated, Class implClass) { + return (TypeResolverBuilder) this.beanFactory.createBean(implClass); } @Override - public KeyDeserializer keyDeserializerInstance(DeserializationConfig config, - Annotated annotated, Class serClass) { - return (KeyDeserializer) this.beanFactory.createBean(serClass); + public TypeIdResolver typeIdResolverInstance(MapperConfig config, Annotated annotated, Class implClass) { + return (TypeIdResolver) this.beanFactory.createBean(implClass); } + /** @since 4.3 */ @Override - public TypeResolverBuilder typeResolverBuilderInstance(MapperConfig config, - Annotated annotated, Class resolverClass) { - return (TypeResolverBuilder) this.beanFactory.createBean(resolverClass); + public ValueInstantiator valueInstantiatorInstance(MapperConfig config, Annotated annotated, Class implClass) { + return (ValueInstantiator) this.beanFactory.createBean(implClass); } + /** @since 4.3 */ @Override - public TypeIdResolver typeIdResolverInstance(MapperConfig config, - Annotated annotated, Class resolverClass) { - return (TypeIdResolver) this.beanFactory.createBean(resolverClass); + public ObjectIdGenerator objectIdGeneratorInstance(MapperConfig config, Annotated annotated, Class implClass) { + return (ObjectIdGenerator) this.beanFactory.createBean(implClass); } + + /** @since 4.3 */ + @Override + public ObjectIdResolver resolverIdGeneratorInstance(MapperConfig config, Annotated annotated, Class implClass) { + return (ObjectIdResolver) this.beanFactory.createBean(implClass); + } + + /** @since 4.3 */ + @Override + public PropertyNamingStrategy namingStrategyInstance(MapperConfig config, Annotated annotated, Class implClass) { + return (PropertyNamingStrategy) this.beanFactory.createBean(implClass); + } + + /** @since 4.3 */ + @Override + public Converter converterInstance(MapperConfig config, Annotated annotated, Class implClass) { + return (Converter) this.beanFactory.createBean(implClass); + } + + /** @since 4.3 */ + @Override + public VirtualBeanPropertyWriter virtualPropertyWriterInstance(MapperConfig config, Class implClass) { + return (VirtualBeanPropertyWriter) this.beanFactory.createBean(implClass); + } + }