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:
committed by
Olga MaciaszekSharma
parent
84fb8550c7
commit
b628338e54
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user