diff --git a/json-view/pom.xml b/json-view/pom.xml index 1b5e052..0a21b9d 100644 --- a/json-view/pom.xml +++ b/json-view/pom.xml @@ -6,7 +6,7 @@ com.monitorjbl json-view - 1.1.0 + 1.1.1-beta json-view Provides programmatic exclusion/inclusion for Jackson JSON serialization https://github.com/monitorjbl/json-view @@ -125,13 +125,11 @@ - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2 + hrs.repo + https://artifactory.int.hrs.com/artifactory/releases-local + + diff --git a/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java b/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java index b0d8df8..4b60b90 100644 --- a/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java +++ b/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java @@ -48,6 +48,9 @@ import static java.util.Arrays.asList; public class JsonViewSerializer extends JsonSerializer { + + private static final String GETTER_PREFIX = "get"; + private static final String BOOLEAN_GETTER_PREFIX = "is"; public static boolean log = false; /** * Cached results from expensive (pure) methods @@ -638,7 +641,7 @@ private List getAccessibleProperties(Class cls) { .map(f -> new AccessibleProperty(f.getName(), f.getAnnotations(), f)) .forEach(p -> accessibleProperties.put(p.name, p)); getDeclaredMethods(cls).stream() - .filter(m -> m.getName().startsWith("get") && !m.getReturnType().equals(Void.class) && m.getParameters().length == 0) + .filter(this::isValidGetter) .map(m -> new AccessibleProperty(getFieldNameFromGetter(m), m.getAnnotations(), m)) .forEach(p -> { AccessibleProperty field = accessibleProperties.get(p.name); @@ -662,6 +665,13 @@ private List getAccessibleProperties(Class cls) { }); } + private boolean isValidGetter(Method m) { + boolean isGetter = m.getName().startsWith(GETTER_PREFIX) && !m.getReturnType().equals(Void.class) && m.getParameters().length == 0; + boolean isBooleanGetter = m.getName().startsWith(BOOLEAN_GETTER_PREFIX) + && m.getReturnType().getSimpleName().equalsIgnoreCase(Boolean.class.getSimpleName()) && m.getParameters().length == 0; + return isGetter || isBooleanGetter; + } + private List getDeclaredFields(Class cls) { List fields = new ArrayList<>(); Stack parents = new Stack<>(); @@ -791,10 +801,18 @@ private String getFieldName(AccessibleProperty property) { } private String getFieldNameFromGetter(Method method) { - if (method.getName().equals("get")) { + String methodName = method.getName(); + if (methodName.equals(GETTER_PREFIX) || methodName.equals(BOOLEAN_GETTER_PREFIX)) { return method.getName(); } - String name = method.getName().replaceFirst("get", ""); + String name; + if (methodName.startsWith(GETTER_PREFIX)) { + name = methodName.replaceFirst(GETTER_PREFIX, ""); + } else if (methodName.startsWith(BOOLEAN_GETTER_PREFIX)){ + name = methodName.replaceFirst(BOOLEAN_GETTER_PREFIX, ""); + } else { + throw new IllegalArgumentException(String.format("'%s' method is not a valid getter", methodName)); + } return name.substring(0, 1).toLowerCase() + name.substring(1); } diff --git a/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java b/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java index a399516..c2f18c5 100644 --- a/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java +++ b/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java @@ -832,6 +832,8 @@ public void testDeepNestedObjects() throws Exception { TestSubobject subobject = new TestSubobject(); subobject.setVal("someval"); subobject.setOtherVal("otherval"); + subobject.setBooleanVal(true); + subobject.setBooleanBoxedVal(true); TestObject ref = new TestObject(); ref.setStr1("somestr"); ref.setSub(subobject); @@ -848,6 +850,9 @@ public void testDeepNestedObjects() throws Exception { Map subMap = (Map) obj.get("sub"); assertNotNull(subMap.get("val")); assertEquals(subobject.getVal(), subMap.get("val")); + assertNotNull(subMap.get("booleanVal")); + assertEquals(subobject.isBooleanVal(), subMap.get("booleanVal")); + assertEquals(subobject.isBooleanBoxedVal(), subMap.get("booleanBoxedVal")); assertNull(subMap.get("otherVal")); } diff --git a/json-view/src/test/java/com/monitorjbl/json/model/TestSubobject.java b/json-view/src/test/java/com/monitorjbl/json/model/TestSubobject.java index fbfb3ff..a7d25b3 100644 --- a/json-view/src/test/java/com/monitorjbl/json/model/TestSubobject.java +++ b/json-view/src/test/java/com/monitorjbl/json/model/TestSubobject.java @@ -4,6 +4,8 @@ public class TestSubobject { private String val; private String otherVal; private TestSubobject sub; + private boolean booleanVal; + private Boolean booleanBoxedVal; public TestSubobject(String val) { this.val = val; @@ -17,6 +19,22 @@ public TestSubobject(String val, TestSubobject sub) { public TestSubobject() { } + public boolean isBooleanVal() { + return booleanVal; + } + + public void setBooleanVal(boolean booleanVal) { + this.booleanVal = booleanVal; + } + + public Boolean isBooleanBoxedVal() { + return booleanBoxedVal; + } + + public void setBooleanBoxedVal(Boolean booleanBoxedVal) { + this.booleanBoxedVal = booleanBoxedVal; + } + public String getVal() { return val; } diff --git a/spring-json-view/pom.xml b/spring-json-view/pom.xml index ed6dc95..eb22c90 100644 --- a/spring-json-view/pom.xml +++ b/spring-json-view/pom.xml @@ -6,7 +6,7 @@ com.monitorjbl spring-json-view - 1.1.0 + 1.1.1-beta spring-json-view Provides programmatic JSON response manipulation for Spring MVC https://github.com/monitorjbl/spring-json-view