SGF-680 - Using SD Repositories and @EnableContinuousQueries causes errors with Spring container initialization.

This commit is contained in:
John Blum
2017-10-23 11:03:36 -07:00
parent 40e2aa7640
commit 77c1cf3e4d
5 changed files with 290 additions and 46 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.data.gemfire.config.annotation;
import static java.util.Arrays.stream;
import static org.springframework.data.gemfire.util.CollectionUtils.nullSafeMap;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -28,7 +29,8 @@ import java.util.concurrent.Executor;
import java.util.stream.Collectors;
import org.apache.geode.cache.GemFireCache;
import org.apache.shiro.util.Assert;
import org.springframework.aop.framework.AopProxyUtils;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +46,7 @@ import org.springframework.data.gemfire.listener.ContinuousQueryListenerContaine
import org.springframework.data.gemfire.listener.annotation.ContinuousQuery;
import org.springframework.data.gemfire.util.CacheUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ErrorHandler;
import org.springframework.util.StringUtils;
@@ -63,6 +66,7 @@ import org.springframework.util.StringUtils;
* @see org.springframework.data.gemfire.listener.ContinuousQueryDefinition
* @see org.springframework.data.gemfire.listener.ContinuousQueryListener
* @see org.springframework.data.gemfire.listener.ContinuousQueryListenerContainer
* @see org.springframework.data.gemfire.listener.annotation.ContinuousQuery
* @since 2.0.0
*/
@Configuration
@@ -82,7 +86,7 @@ public class ContinuousQueryConfiguration extends AbstractAnnotationConfigSuppor
private String taskExecutorBeanName;
@Override
protected Class getAnnotationType() {
protected Class<? extends Annotation> getAnnotationType() {
return EnableContinuousQueries.class;
}
@@ -118,11 +122,14 @@ public class ContinuousQueryConfiguration extends AbstractAnnotationConfigSuppor
this.continuousQueryDefinitions.forEach(this.container::addListener);
this.continuousQueryDefinitions.clear();
}
else if (isApplicationBean(bean)) {
else if (isApplicationBean(bean, beanName)) {
List<ContinuousQueryDefinition> definitions = stream(bean.getClass().getMethods())
//Object resolvedBean = resolveTargetObject(bean);
Object resolvedBean = bean;
List<ContinuousQueryDefinition> definitions = stream(resolvedBean.getClass().getMethods())
.filter(method -> method.isAnnotationPresent(ContinuousQuery.class))
.map(method -> ContinuousQueryDefinition.from(bean, method))
.map(method -> ContinuousQueryDefinition.from(resolvedBean, method))
.collect(Collectors.toList());
Optional.ofNullable(this.container).map(container -> {
@@ -140,15 +147,36 @@ public class ContinuousQueryConfiguration extends AbstractAnnotationConfigSuppor
};
}
private boolean isApplicationBean(Object bean) {
private boolean isApplicationBean(Object bean, String beanName) {
return Optional.ofNullable(bean)
//.filter(this::isNotProxy)
//.map(this::resolveTargetObject)
.map(Object::getClass)
.filter(type -> type.getPackage().getName().startsWith(ORG_SPRINGFRAMEWORK_DATA_GEMFIRE_PACKAGE_NAME)
|| !type.getPackage().getName().startsWith(ORG_SPRINGFRAMEWORK_PACKAGE_NAME))
.map(Class::getPackage)
.map(Package::getName)
.filter(StringUtils::hasText)
.filter(packageName -> packageName.startsWith(ORG_SPRINGFRAMEWORK_DATA_GEMFIRE_PACKAGE_NAME)
|| !packageName.startsWith(ORG_SPRINGFRAMEWORK_PACKAGE_NAME))
.isPresent();
}
private boolean isNotProxy(Object bean) {
return !isProxy(bean);
}
private boolean isProxy(Object bean) {
return AopUtils.isAopProxy(bean);
}
private Object resolveTargetObject(Object bean) {
return Optional.ofNullable(bean)
.filter(this::isProxy)
.map(proxy -> AopProxyUtils.getSingletonTarget(proxy))
.orElse(bean);
}
@Bean
public ContinuousQueryListenerContainer continuousQueryListenerContainer(GemFireCache gemfireCache) {