001/* 002 * Copyright 2002-2016 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * https://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.http.converter.json; 018 019import com.fasterxml.jackson.annotation.ObjectIdGenerator; 020import com.fasterxml.jackson.annotation.ObjectIdResolver; 021import com.fasterxml.jackson.databind.DeserializationConfig; 022import com.fasterxml.jackson.databind.JsonDeserializer; 023import com.fasterxml.jackson.databind.JsonSerializer; 024import com.fasterxml.jackson.databind.KeyDeserializer; 025import com.fasterxml.jackson.databind.PropertyNamingStrategy; 026import com.fasterxml.jackson.databind.SerializationConfig; 027import com.fasterxml.jackson.databind.cfg.HandlerInstantiator; 028import com.fasterxml.jackson.databind.cfg.MapperConfig; 029import com.fasterxml.jackson.databind.deser.ValueInstantiator; 030import com.fasterxml.jackson.databind.introspect.Annotated; 031import com.fasterxml.jackson.databind.jsontype.TypeIdResolver; 032import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder; 033import com.fasterxml.jackson.databind.ser.VirtualBeanPropertyWriter; 034import com.fasterxml.jackson.databind.util.Converter; 035 036import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 037import org.springframework.context.ApplicationContext; 038import org.springframework.util.Assert; 039 040/** 041 * Allows for creating Jackson ({@link JsonSerializer}, {@link JsonDeserializer}, 042 * {@link KeyDeserializer}, {@link TypeResolverBuilder}, {@link TypeIdResolver}) 043 * beans with autowiring against a Spring {@link ApplicationContext}. 044 * 045 * <p>As of Spring 4.3, this overrides all factory methods in {@link HandlerInstantiator}, 046 * including non-abstract ones and recently introduced ones from Jackson 2.4 and 2.5: 047 * for {@link ValueInstantiator}, {@link ObjectIdGenerator}, {@link ObjectIdResolver}, 048 * {@link PropertyNamingStrategy}, {@link Converter}, {@link VirtualBeanPropertyWriter}. 049 * 050 * @author Sebastien Deleuze 051 * @author Juergen Hoeller 052 * @since 4.1.3 053 * @see Jackson2ObjectMapperBuilder#handlerInstantiator(HandlerInstantiator) 054 * @see ApplicationContext#getAutowireCapableBeanFactory() 055 * @see HandlerInstantiator 056 */ 057public class SpringHandlerInstantiator extends HandlerInstantiator { 058 059 private final AutowireCapableBeanFactory beanFactory; 060 061 062 /** 063 * Create a new SpringHandlerInstantiator for the given BeanFactory. 064 * @param beanFactory the target BeanFactory 065 */ 066 public SpringHandlerInstantiator(AutowireCapableBeanFactory beanFactory) { 067 Assert.notNull(beanFactory, "BeanFactory must not be null"); 068 this.beanFactory = beanFactory; 069 } 070 071 072 @Override 073 public JsonDeserializer<?> deserializerInstance(DeserializationConfig config, Annotated annotated, Class<?> implClass) { 074 return (JsonDeserializer<?>) this.beanFactory.createBean(implClass); 075 } 076 077 @Override 078 public KeyDeserializer keyDeserializerInstance(DeserializationConfig config, Annotated annotated, Class<?> implClass) { 079 return (KeyDeserializer) this.beanFactory.createBean(implClass); 080 } 081 082 @Override 083 public JsonSerializer<?> serializerInstance(SerializationConfig config, Annotated annotated, Class<?> implClass) { 084 return (JsonSerializer<?>) this.beanFactory.createBean(implClass); 085 } 086 087 @Override 088 public TypeResolverBuilder<?> typeResolverBuilderInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) { 089 return (TypeResolverBuilder<?>) this.beanFactory.createBean(implClass); 090 } 091 092 @Override 093 public TypeIdResolver typeIdResolverInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) { 094 return (TypeIdResolver) this.beanFactory.createBean(implClass); 095 } 096 097 /** @since 4.3 */ 098 @Override 099 public ValueInstantiator valueInstantiatorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) { 100 return (ValueInstantiator) this.beanFactory.createBean(implClass); 101 } 102 103 /** @since 4.3 */ 104 @Override 105 public ObjectIdGenerator<?> objectIdGeneratorInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) { 106 return (ObjectIdGenerator<?>) this.beanFactory.createBean(implClass); 107 } 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 133}