From 91bc2bbb4238e62e36f60f9760c49654d78630a2 Mon Sep 17 00:00:00 2001 From: rkwasnicki Date: Mon, 3 Oct 2022 19:29:55 +0200 Subject: [PATCH 1/3] allow isGetters to be != boolean --- .../introspect/DefaultAccessorNamingStrategy.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java b/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java index c8483ea7ee..9dfd273ad7 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java @@ -69,13 +69,10 @@ protected DefaultAccessorNamingStrategy(MapperConfig config, AnnotatedClass f public String findNameForIsGetter(AnnotatedMethod am, String name) { if (_isGetterPrefix != null) { - final Class rt = am.getRawType(); - if (rt == Boolean.class || rt == Boolean.TYPE) { - if (name.startsWith(_isGetterPrefix)) { - return _stdBeanNaming - ? stdManglePropertyName(name, 2) - : legacyManglePropertyName(name, 2); - } + if (name.startsWith(_isGetterPrefix)) { + return _stdBeanNaming + ? stdManglePropertyName(name, 2) + : legacyManglePropertyName(name, 2); } } return null; From 608684d369514b86b9c441e2d1ec079b9ec7f48f Mon Sep 17 00:00:00 2001 From: rkwasnicki Date: Tue, 4 Oct 2022 08:59:49 +0200 Subject: [PATCH 2/3] add MapperFeature --- .../fasterxml/jackson/databind/MapperFeature.java | 9 +++++++++ .../introspect/DefaultAccessorNamingStrategy.java | 13 +++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java b/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java index 5cace6d369..e2ad5b5c0b 100644 --- a/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java +++ b/src/main/java/com/fasterxml/jackson/databind/MapperFeature.java @@ -486,6 +486,15 @@ public enum MapperFeature implements ConfigFeature */ ALLOW_EXPLICIT_PROPERTY_RENAMING(false), + /** + * Feature that when enabled will allow getters with is-Prefix also for non-boolean return types. + *

+ * Feature is disabled by default. + * + * @since 2.14 + */ + ALLOW_IS_GETTERS_FOR_NON_BOOLEAN(false), + /* /****************************************************** /* Coercion features diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java b/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java index 9dfd273ad7..15adfde0cc 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/DefaultAccessorNamingStrategy.java @@ -41,6 +41,7 @@ public interface BaseNameValidator { protected final BaseNameValidator _baseNameValidator; protected final boolean _stdBeanNaming; + protected final boolean _isGettersNonBoolean; protected final String _getterPrefix; protected final String _isGetterPrefix; @@ -59,6 +60,7 @@ protected DefaultAccessorNamingStrategy(MapperConfig config, AnnotatedClass f _forClass = forClass; _stdBeanNaming = config.isEnabled(MapperFeature.USE_STD_BEAN_NAMING); + _isGettersNonBoolean = config.isEnabled(MapperFeature.ALLOW_IS_GETTERS_FOR_NON_BOOLEAN); _mutatorPrefix = mutatorPrefix; _getterPrefix = getterPrefix; _isGetterPrefix = isGetterPrefix; @@ -69,10 +71,13 @@ protected DefaultAccessorNamingStrategy(MapperConfig config, AnnotatedClass f public String findNameForIsGetter(AnnotatedMethod am, String name) { if (_isGetterPrefix != null) { - if (name.startsWith(_isGetterPrefix)) { - return _stdBeanNaming - ? stdManglePropertyName(name, 2) - : legacyManglePropertyName(name, 2); + final Class rt = am.getRawType(); + if (_isGettersNonBoolean || rt == Boolean.class || rt == Boolean.TYPE) { + if (name.startsWith(_isGetterPrefix)) { + return _stdBeanNaming + ? stdManglePropertyName(name, 2) + : legacyManglePropertyName(name, 2); + } } } return null; From 7f27d740f2cafdb20315db0c7b7e8628e407475c Mon Sep 17 00:00:00 2001 From: rkwasnicki Date: Tue, 4 Oct 2022 09:10:34 +0200 Subject: [PATCH 3/3] add test --- .../introspect/IsGetterBoolean3609Test.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/introspect/IsGetterBoolean3609Test.java diff --git a/src/test/java/com/fasterxml/jackson/databind/introspect/IsGetterBoolean3609Test.java b/src/test/java/com/fasterxml/jackson/databind/introspect/IsGetterBoolean3609Test.java new file mode 100644 index 0000000000..191f903bb1 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/introspect/IsGetterBoolean3609Test.java @@ -0,0 +1,57 @@ +package com.fasterxml.jackson.databind.introspect; + +import com.fasterxml.jackson.databind.BaseMapTest; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; + +import java.util.Collections; +import java.util.Map; + +import static com.fasterxml.jackson.databind.MapperFeature.ALLOW_IS_GETTERS_FOR_NON_BOOLEAN; + +public class IsGetterBoolean3609Test extends BaseMapTest { + + static class POJO3609 { + int isEnabled; + + protected POJO3609() { } + public POJO3609(int b) { + isEnabled = b; + } + + public int isEnabled() { return isEnabled; } + public void setEnabled(int b) { isEnabled = b; } + } + + public void testAllowIntIsGetter() throws Exception + { + ObjectMapper MAPPER = jsonMapperBuilder() + .enable(ALLOW_IS_GETTERS_FOR_NON_BOOLEAN) + .build(); + + POJO3609 input = new POJO3609(12); + final String json = MAPPER.writeValueAsString(input); + + Map props = MAPPER.readValue(json, Map.class); + assertEquals(Collections.singletonMap("enabled", 12), + props); + + POJO3609 output = MAPPER.readValue(json, POJO3609.class); + assertEquals(input.isEnabled, output.isEnabled); + } + + public void testDisallowIntIsGetter() throws Exception + { + ObjectMapper MAPPER = jsonMapperBuilder() + .disable(ALLOW_IS_GETTERS_FOR_NON_BOOLEAN) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .build(); + + POJO3609 input = new POJO3609(12); + final String json = MAPPER.writeValueAsString(input); + + assertEquals("{}", json); + + } +}