package com.github.ryoasai.springmvc.json; import java.io.IOException; import java.util.Collection; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.SerializerProvider; import org.codehaus.jackson.map.ser.BeanPropertyWriter; import org.codehaus.jackson.map.ser.BeanSerializer; import org.springframework.beans.BeanWrapper; import org.springframework.beans.PropertyAccessorFactory; import org.springframework.core.convert.ConversionService; public class ConversionServiceBeanSerializer extends BeanSerializer { private ConversionService conversionService; private BeanWrapper beanWrapper; public ConversionServiceBeanSerializer(ConversionService conversionService, Class<?> type, BeanPropertyWriter[] writers) { this(conversionService, type, writers, null); } public ConversionServiceBeanSerializer(ConversionService conversionService, Class<?> type, Collection<BeanPropertyWriter> props) { this(conversionService, type, props.toArray(new BeanPropertyWriter[props.size()])); } public ConversionServiceBeanSerializer(ConversionService conversionService, Class<?> type, BeanPropertyWriter[] props, BeanPropertyWriter[] filteredProps) { super(type, props, filteredProps); // FIXME store direct array reference. this.conversionService = conversionService; replaceBeanPropertyWriters(_props); } private void replaceBeanPropertyWriters(BeanPropertyWriter[] propWriters) { for (int i = 0; i < propWriters.length; i++) { propWriters[i] = new ConversionServiceBeanPropertyWriter(this, conversionService, propWriters[i]); } } @Override protected void serializeFields(Object bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { this.beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(bean); super.serializeFields(bean, jgen, provider); } public BeanWrapper getBeanWrapper() { return beanWrapper; } }