diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/MessagingAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/MessagingAnnotationPostProcessor.java index 1a7a2440c1..8ff1241094 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/MessagingAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/MessagingAnnotationPostProcessor.java @@ -44,6 +44,8 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.MergedAnnotation; +import org.springframework.core.annotation.MergedAnnotations; import org.springframework.integration.annotation.Aggregator; import org.springframework.integration.annotation.BridgeFrom; import org.springframework.integration.annotation.BridgeTo; @@ -263,18 +265,17 @@ public class MessagingAnnotationPostProcessor implements BeanPostProcessor, Bean * @return the hierarchical list of annotations in top-bottom order. */ protected List getAnnotationChain(Method method, Class annotationType) { - Annotation[] annotations = AnnotationUtils.getAnnotations(method); List annotationChain = new LinkedList<>(); - if (annotations != null) { - Set visited = new HashSet<>(); - for (Annotation ann : annotations) { - recursiveFindAnnotation(annotationType, ann, annotationChain, visited); - if (annotationChain.size() > 0) { - Collections.reverse(annotationChain); - return annotationChain; - } + Set visited = new HashSet<>(); + + for (MergedAnnotation mergedAnnotation : MergedAnnotations.from(method)) { + recursiveFindAnnotation(annotationType, mergedAnnotation.synthesize(), annotationChain, visited); + if (annotationChain.size() > 0) { + Collections.reverse(annotationChain); + return annotationChain; } } + return annotationChain; } diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationJmxAttributeSource.java b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationJmxAttributeSource.java index a0ad8788eb..7de67f38ac 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationJmxAttributeSource.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationJmxAttributeSource.java @@ -16,11 +16,19 @@ package org.springframework.integration.monitor; -import org.springframework.beans.annotation.AnnotationBeanUtils; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.PropertyAccessorFactory; +import org.springframework.beans.PropertyValue; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.EmbeddedValueResolver; -import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.MergedAnnotation; +import org.springframework.core.annotation.MergedAnnotations; import org.springframework.integration.support.management.IntegrationManagedResource; import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource; import org.springframework.jmx.export.metadata.InvalidMetadataException; @@ -33,16 +41,13 @@ import org.springframework.util.StringValueResolver; * * @author Gary Russell * @author Artem Bilan + * * @since 4.3 */ public class IntegrationJmxAttributeSource extends AnnotationJmxAttributeSource { private StringValueResolver valueResolver; - public void setValueResolver(StringValueResolver valueResolver) { - this.valueResolver = valueResolver; - } - @Override public void setBeanFactory(BeanFactory beanFactory) { super.setBeanFactory(beanFactory); @@ -53,13 +58,34 @@ public class IntegrationJmxAttributeSource extends AnnotationJmxAttributeSource @Override public ManagedResource getManagedResource(Class beanClass) throws InvalidMetadataException { - IntegrationManagedResource ann = AnnotationUtils.getAnnotation(beanClass, IntegrationManagedResource.class); - if (ann == null) { + MergedAnnotation ann = + MergedAnnotations.from(beanClass, MergedAnnotations.SearchStrategy.EXHAUSTIVE) + .get(IntegrationManagedResource.class) + .withNonMergedAttributes(); + if (!ann.isPresent()) { return null; } - ManagedResource managedResource = new ManagedResource(); - AnnotationBeanUtils.copyPropertiesToBean(ann, managedResource, this.valueResolver); - return managedResource; + Class declaringClass = (Class) ann.getSource(); + Class target = (declaringClass != null && !declaringClass.isInterface() ? declaringClass : beanClass); + if (!Modifier.isPublic(target.getModifiers())) { + throw new InvalidMetadataException("@IntegrationManagedResource class '" + target.getName() + + "' must be public"); + } + + ManagedResource bean = new ManagedResource(); + Map map = ann.asMap(); + List list = new ArrayList<>(map.size()); + map.forEach((attrName, attrValue) -> { + if (!"value".equals(attrName)) { + Object value = attrValue; + if (this.valueResolver != null && value instanceof String) { + value = this.valueResolver.resolveStringValue((String) value); + } + list.add(new PropertyValue(attrName, value)); + } + }); + PropertyAccessorFactory.forBeanPropertyAccess(bean).setPropertyValues(new MutablePropertyValues(list)); + return bean; } } diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java index e2b67ae64b..eb812fc826 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java @@ -37,10 +37,10 @@ import javax.management.modelmbean.ModelMBean; import org.springframework.aop.TargetSource; import org.springframework.aop.framework.Advised; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.context.Lifecycle; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.IntegrationManagementConfigurer; @@ -84,7 +84,6 @@ import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; -import org.springframework.util.StringValueResolver; /** *

@@ -115,8 +114,8 @@ import org.springframework.util.StringValueResolver; * @author Meherzad Lahewala */ @ManagedResource -public class IntegrationMBeanExporter extends MBeanExporter implements ApplicationContextAware, - EmbeddedValueResolverAware, DestructionAwareBeanPostProcessor { +public class IntegrationMBeanExporter extends MBeanExporter + implements ApplicationContextAware, DestructionAwareBeanPostProcessor { private static final String SI_PACKAGE = "org.springframework.integration"; @@ -217,8 +216,9 @@ public class IntegrationMBeanExporter extends MBeanExporter implements Applicati } @Override - public void setEmbeddedValueResolver(StringValueResolver resolver) { - this.attributeSource.setValueResolver(resolver); + public void setBeanFactory(BeanFactory beanFactory) { + super.setBeanFactory(beanFactory); + this.attributeSource.setBeanFactory(beanFactory); } @Override