Fixes gh-898

If HikariDataSource bean gets AOP-proxied more than once, the spring-cloud rebind operation doesn't treat it as never-refreshable.
This commit is contained in:
o.gusev
2021-02-18 11:56:05 +03:00
committed by Olga MaciaszekSharma
parent 84fb8550c7
commit b628338e54
2 changed files with 19 additions and 1 deletions

View File

@@ -94,7 +94,7 @@ public class ConfigurationPropertiesRebinder
try {
Object bean = this.applicationContext.getBean(name);
if (AopUtils.isAopProxy(bean)) {
bean = ProxyUtils.getTargetObject(bean);
bean = ProxyUtils.getUltimateTargetObject(bean);
}
if (bean != null) {
// TODO: determine a more general approach to fix this.

View File

@@ -18,6 +18,7 @@ package org.springframework.cloud.util;
import org.springframework.aop.framework.Advised;
import org.springframework.aop.support.AopUtils;
import org.springframework.util.Assert;
/**
* @author Ryan Baxter
@@ -41,4 +42,21 @@ public final class ProxyUtils {
return (T) candidate;
}
@SuppressWarnings("unchecked")
public static <T> T getUltimateTargetObject(Object candidate) {
Assert.notNull(candidate, "Candidate must not be null");
try {
if (AopUtils.isAopProxy(candidate) && candidate instanceof Advised) {
Object target = ((Advised) candidate).getTargetSource().getTarget();
if (target != null) {
return (T) getUltimateTargetObject(target);
}
}
}
catch (Exception ex) {
throw new IllegalStateException("Failed to unwrap proxied object", ex);
}
return (T) candidate;
}
}