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, 074 Annotated annotated, Class<?> implClass) { 075 076 return (JsonDeserializer<?>) this.beanFactory.createBean(implClass); 077 } 078 079 @Override 080 public KeyDeserializer keyDeserializerInstance(DeserializationConfig config, 081 Annotated annotated, Class<?> implClass) { 082 083 return (KeyDeserializer) this.beanFactory.createBean(implClass); 084 } 085 086 @Override 087 public JsonSerializer<?> serializerInstance(SerializationConfig config, 088 Annotated annotated, Class<?> implClass) { 089 090 return (JsonSerializer<?>) this.beanFactory.createBean(implClass); 091 } 092 093 @Override 094 public TypeResolverBuilder<?> typeResolverBuilderInstance(MapperConfig<?> config, 095 Annotated annotated, Class<?> implClass) { 096 097 return (TypeResolverBuilder<?>) this.beanFactory.createBean(implClass); 098 } 099 100 @Override 101 public TypeIdResolver typeIdResolverInstance(MapperConfig<?> config, Annotated annotated, Class<?> implClass) { 102 return (TypeIdResolver) this.beanFactory.createBean(implClass); 103 } 104 105 /** @since 4.3 */ 106 @Override 107 public ValueInstantiator valueInstantiatorInstance(MapperConfig<?> config, 108 Annotated annotated, Class<?> implClass) { 109 110 return (ValueInstantiator) this.beanFactory.createBean(implClass); 111 } 112 113 /** @since 4.3 */ 114 @Override 115 public ObjectIdGenerator<?> objectIdGeneratorInstance(MapperConfig<?> config, 116 Annotated annotated, Class<?> implClass) { 117 118 return (ObjectIdGenerator<?>) this.beanFactory.createBean(implClass); 119 } 120 121 /** @since 4.3 */ 122 @Override 123 public ObjectIdResolver resolverIdGeneratorInstance(MapperConfig<?> config, 124 Annotated annotated, Class<?> implClass) { 125 126 return (ObjectIdResolver) this.beanFactory.createBean(implClass); 127 } 128 129 /** @since 4.3 */ 130 @Override 131 public PropertyNamingStrategy namingStrategyInstance(MapperConfig<?> config, 132 Annotated annotated, Class<?> implClass) { 133 134 return (PropertyNamingStrategy) this.beanFactory.createBean(implClass); 135 } 136 137 /** @since 4.3 */ 138 @Override 139 public Converter<?, ?> converterInstance(MapperConfig<?> config, 140 Annotated annotated, Class<?> implClass) { 141 142 return (Converter<?, ?>) this.beanFactory.createBean(implClass); 143 } 144 145 /** @since 4.3 */ 146 @Override 147 public VirtualBeanPropertyWriter virtualPropertyWriterInstance(MapperConfig<?> config, Class<?> implClass) { 148 return (VirtualBeanPropertyWriter) this.beanFactory.createBean(implClass); 149 } 150 151}