diff --git a/src/main/java/tools/jackson/databind/ser/BeanSerializerFactory.java b/src/main/java/tools/jackson/databind/ser/BeanSerializerFactory.java index e08abd6913..b1b18a32dc 100644 --- a/src/main/java/tools/jackson/databind/ser/BeanSerializerFactory.java +++ b/src/main/java/tools/jackson/databind/ser/BeanSerializerFactory.java @@ -161,6 +161,9 @@ public ValueSerializer createSerializer(SerializationContext ctxt, JavaT beanDescRef = ctxt.lazyIntrospectBeanDescription(type); } } + if (formatOverrides == null) { + formatOverrides = _calculateEffectiveFormat(ctxt, beanDescRef, type.getRawClass(), JsonFormat.Value.empty()); + } // Slight detour: do we have a Converter to consider? Converter conv = config.findSerializationConverter(beanDescRef.getClassInfo()); if (conv != null) { // yup, need converter diff --git a/src/test/java/tools/jackson/databind/ser/jdk/NumberSerTest.java b/src/test/java/tools/jackson/databind/ser/jdk/NumberSerTest.java index 99c4715930..1d4169a1f7 100644 --- a/src/test/java/tools/jackson/databind/ser/jdk/NumberSerTest.java +++ b/src/test/java/tools/jackson/databind/ser/jdk/NumberSerTest.java @@ -17,6 +17,7 @@ import tools.jackson.databind.SerializationContext; import tools.jackson.databind.ValueSerializer; import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.json.JsonMapper; import tools.jackson.databind.module.SimpleModule; import tools.jackson.databind.testutil.DatabindTestUtil; @@ -117,6 +118,12 @@ public void serialize(BigDecimal value, JsonGenerator gen, SerializationContext } } + static class MyBigDecimal extends BigDecimal { + public MyBigDecimal(String value) { + super(value); + } + } + /* /********************************************************** /* Test methods @@ -225,6 +232,24 @@ public void testCustomSerializationBigDecimalAsNumber() throws Exception { assertEquals(a2q("{'value':2.0}"), mapper.writeValueAsString(new BigDecimalHolder("2"))); } + @Test + public void testConfigOverrideJdkNumber() throws Exception { + JsonMapper mapper = jsonMapperBuilder().withConfigOverride(BigDecimal.class, + c -> c.setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.STRING))) + .build(); + String value = mapper.writeValueAsString(new BigDecimal("123.456")); + assertEquals(a2q("'123.456'"), value); + } + + @Test + public void testConfigOverrideNonJdkNumber() throws Exception { + JsonMapper mapper = jsonMapperBuilder().withConfigOverride(MyBigDecimal.class, + c -> c.setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.STRING))) + .build(); + String value = mapper.writeValueAsString(new MyBigDecimal("123.456")); + assertEquals(a2q("'123.456'"), value); + } + // default locale is en_US static DecimalFormat createDecimalFormatForDefaultLocale(final String pattern) { return new DecimalFormat(pattern, new DecimalFormatSymbols(Locale.ENGLISH));