From 530151de0197b641045a711d3d6a7d2789924a00 Mon Sep 17 00:00:00 2001 From: Christian Wiech Date: Sun, 8 Dec 2019 13:03:26 +0100 Subject: [PATCH 1/4] Make Optional inheritable (references #659) --- config/src/main/java/com/typesafe/config/Optional.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/src/main/java/com/typesafe/config/Optional.java b/config/src/main/java/com/typesafe/config/Optional.java index 4645ed5fb..5498b8f41 100644 --- a/config/src/main/java/com/typesafe/config/Optional.java +++ b/config/src/main/java/com/typesafe/config/Optional.java @@ -1,6 +1,7 @@ package com.typesafe.config; import java.lang.annotation.Documented; +import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -8,6 +9,7 @@ * Allows an config property to be {@code null}. */ @Documented +@Inherited @Retention(RetentionPolicy.RUNTIME) public @interface Optional { From b41efdffacfcedaeb71ca4986566b2df92ea5d18 Mon Sep 17 00:00:00 2001 From: Christian Wiech Date: Sun, 8 Dec 2019 13:05:34 +0100 Subject: [PATCH 2/4] Evaluate getter for optional annotation if field exists (references #659) --- .../main/java/com/typesafe/config/impl/ConfigBeanImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java b/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java index 2b9cf5c60..902311359 100644 --- a/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java +++ b/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java @@ -285,7 +285,10 @@ private static boolean hasAtLeastOneBeanProperty(Class clazz) { private static boolean isOptionalProperty(Class beanClass, PropertyDescriptor beanProp) { Field field = getField(beanClass, beanProp.getName()); - return field != null ? field.getAnnotationsByType(Optional.class).length > 0 : beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0; + return field != null + ? field.getAnnotationsByType(Optional.class).length > 0 + || beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0 + : beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0; } private static Field getField(Class beanClass, String fieldName) { From 4fda1da4165b7dc423434f473068fe07aaed6b7c Mon Sep 17 00:00:00 2001 From: Christian Wiech Date: Sat, 16 May 2020 18:34:00 +0200 Subject: [PATCH 3/4] Perform getter evaluation before field evaluation because it is less expansive --- .../main/java/com/typesafe/config/impl/ConfigBeanImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java b/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java index 902311359..e6ce7a568 100644 --- a/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java +++ b/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java @@ -286,8 +286,8 @@ private static boolean hasAtLeastOneBeanProperty(Class clazz) { private static boolean isOptionalProperty(Class beanClass, PropertyDescriptor beanProp) { Field field = getField(beanClass, beanProp.getName()); return field != null - ? field.getAnnotationsByType(Optional.class).length > 0 - || beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0 + ? beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0 + || field.getAnnotationsByType(Optional.class).length > 0 : beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0; } From 9f74ceae67ae559fe62d79ba00f63b99dffe20f8 Mon Sep 17 00:00:00 2001 From: Christian Wiech Date: Sat, 16 May 2020 21:01:00 +0200 Subject: [PATCH 4/4] Check method annotation before field evaluation --- .../java/com/typesafe/config/impl/ConfigBeanImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java b/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java index e6ce7a568..89e43b2fc 100644 --- a/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java +++ b/config/src/main/java/com/typesafe/config/impl/ConfigBeanImpl.java @@ -284,11 +284,11 @@ private static boolean hasAtLeastOneBeanProperty(Class clazz) { } private static boolean isOptionalProperty(Class beanClass, PropertyDescriptor beanProp) { + if (beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0) { + return true; + } Field field = getField(beanClass, beanProp.getName()); - return field != null - ? beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0 - || field.getAnnotationsByType(Optional.class).length > 0 - : beanProp.getReadMethod().getAnnotationsByType(Optional.class).length > 0; + return field != null && field.getAnnotationsByType(Optional.class).length > 0; } private static Field getField(Class beanClass, String fieldName) {