package com.github.ryoasai.springmvc.json; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.JsonSerializer; import org.codehaus.jackson.map.SerializerProvider; import org.codehaus.jackson.map.ser.BeanPropertyWriter; import org.codehaus.jackson.type.JavaType; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; public class ConversionServiceBeanPropertyWriter extends BeanPropertyWriter { private ConversionService conversionService; private ConversionServiceBeanSerializer beanSerializer; public ConversionServiceBeanPropertyWriter( ConversionServiceBeanSerializer beanSerializer, ConversionService conversionService, BeanPropertyWriter base) { super(base); this.beanSerializer = beanSerializer; this.conversionService = conversionService; } @Override public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov) throws Exception { Object value = get(bean); BeanWrapper beanWrapper = beanSerializer.getBeanWrapper(); TypeDescriptor fieldDesc = beanWrapper .getPropertyTypeDescriptor(getName()); TypeDescriptor strDesc = TypeDescriptor.valueOf(String.class); if (fieldDesc != null && BeanUtils.isSimpleValueType(fieldDesc.getType()) && this.conversionService.canConvert(fieldDesc, strDesc)) { Object formattedValue = this.conversionService.convert(value, fieldDesc, strDesc); doSerializeAsField(bean, formattedValue, jgen, prov); } else { doSerializeAsField(bean, value, jgen, prov); } } private void doSerializeAsField(Object bean, Object value, JsonGenerator jgen, SerializerProvider prov) throws Exception { // Null handling is bit different, check that first if (value == null) { if (!_suppressNulls) { jgen.writeFieldName(_name); prov.getNullValueSerializer().serialize(value, jgen, prov); } return; } // For non-nulls, first: simple check for direct cycles if (value == bean) { _reportSelfReference(bean); } if (_suppressableValue != null && _suppressableValue.equals(value)) { return; } JsonSerializer<Object> ser = _serializer; if (ser == null) { Class<?> cls = value.getClass(); if (_nonTrivialBaseType != null) { JavaType t = _nonTrivialBaseType.forcedNarrowBy(cls); ser = prov.findValueSerializer(t); } else { ser = prov.findValueSerializer(cls); } } jgen.writeFieldName(_name); if (_typeSerializer == null) { ser.serialize(value, jgen, prov); } else { ser.serializeWithType(value, jgen, prov, _typeSerializer); } } }