package restx.jackson; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; import java.lang.reflect.Member; import java.math.BigDecimal; /** * User: xavierhanin * Date: 2/2/13 * Time: 5:51 PM */ public class FixedPrecisionSerializer extends StdSerializer<BigDecimal> implements ContextualSerializer { private final int precision; private final BigDecimal mul; public FixedPrecisionSerializer() { this(0); } public FixedPrecisionSerializer(int precision) { super(BigDecimal.class); this.precision = precision; mul = new BigDecimal(10).pow(precision); } @Override public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeNumber(value.multiply(mul).longValue()); } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { Member member = property.getMember().getMember(); if (member instanceof Field) { FixedPrecision fixedPrecision = ((AnnotatedElement) member).getAnnotation(FixedPrecision.class); if (fixedPrecision != null) { return new FixedPrecisionSerializer(fixedPrecision.value()); } } return this; } }