diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/AffectedConfigurationPropertiesRebinder.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/AffectedConfigurationPropertiesRebinder.java index 2c0f34905..711df1483 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/AffectedConfigurationPropertiesRebinder.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/AffectedConfigurationPropertiesRebinder.java @@ -26,6 +26,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import com.tencent.cloud.common.util.ReflectionUtils; import com.tencent.polaris.api.utils.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,13 +38,9 @@ import org.springframework.cloud.context.properties.ConfigurationPropertiesBeans import org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; -import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; -import static java.util.Locale.ENGLISH; - /** * Optimize {@link ConfigurationPropertiesRebinder}, only rebuild affected beans. * @@ -58,8 +55,6 @@ public class AffectedConfigurationPropertiesRebinder extends ConfigurationProper private final Map> propertiesBeanDefaultValues = new ConcurrentHashMap<>(); - private final String SET_PREFIX = "set"; - public AffectedConfigurationPropertiesRebinder(ConfigurationPropertiesBeans beans) { super(beans); } @@ -115,9 +110,10 @@ public class AffectedConfigurationPropertiesRebinder extends ConfigurationProper Object bean = applicationContext.getBean(beanName); Field field = ReflectionUtils.findField(bean.getClass(), fieldName); - assert field != null; - field.setAccessible(true); - field.set(bean, defaultValues.get(fieldName)); + if (field != null) { + field.setAccessible(true); + field.set(bean, defaultValues.get(fieldName)); + } } catch (Exception e) { LOGGER.error("[SCT Config] rebind default value error, bean = {}, key = {}", beanName, key); @@ -142,8 +138,7 @@ public class AffectedConfigurationPropertiesRebinder extends ConfigurationProper } }, field -> { int modifiers = field.getModifiers(); - String setMethodName = SET_PREFIX + capitalize(field.getName()); - return !Modifier.isFinal(modifiers) && !Modifier.isStatic(modifiers) && ClassUtils.hasMethod(field.getDeclaringClass(), setMethodName, field.getType()); + return !Modifier.isFinal(modifiers) && !Modifier.isStatic(modifiers) && ReflectionUtils.writableBeanField(field); }); } catch (Exception ignored) { @@ -152,11 +147,4 @@ public class AffectedConfigurationPropertiesRebinder extends ConfigurationProper propertiesBeanDefaultValues.put(propertiesBean.getName(), defaultValues); } } - - private String capitalize(String name) { - if (name == null || name.length() == 0) { - return name; - } - return name.substring(0, 1).toUpperCase(ENGLISH) + name.substring(1); - } } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ReflectionUtils.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ReflectionUtils.java index ef706673f..bc2e20c9d 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ReflectionUtils.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ReflectionUtils.java @@ -19,16 +19,34 @@ package com.tencent.cloud.common.util; import java.lang.reflect.Field; +import org.springframework.util.ClassUtils; + +import static java.util.Locale.ENGLISH; + /** * Reflection Utils. * * @author Haotian Zhang */ -public final class ReflectionUtils { +public final class ReflectionUtils extends org.springframework.util.ReflectionUtils { + private final static String SET_PREFIX = "set"; private ReflectionUtils() { } + public static boolean writableBeanField(Field field) { + String fieldName = field.getName(); + String setMethodName = SET_PREFIX + capitalize(fieldName); + return ClassUtils.hasMethod(field.getDeclaringClass(), setMethodName, field.getType()); + } + + public static String capitalize(String name) { + if (name == null || name.length() == 0) { + return name; + } + return name.substring(0, 1).toUpperCase(ENGLISH) + name.substring(1); + } + public static Object getFieldValue(Object instance, String fieldName) { Field field = org.springframework.util.ReflectionUtils.findField(instance.getClass(), fieldName); if (field == null) { diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java index 1a88235de..3b3348ea4 100644 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java +++ b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java @@ -34,6 +34,8 @@ public class Person { private int age; + private boolean isDirector; + public String getName() { return name; } @@ -50,8 +52,17 @@ public class Person { this.age = age; } + + public boolean isDirector() { + return isDirector; + } + + public void setIsDirector(boolean isDirector) { + this.isDirector = isDirector; + } + @Override public String toString() { - return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; + return "User{" + "name='" + name + '\'' + ", age=" + age + ", isDirector=" + isDirector + '\'' + '}'; } }