From 00c404f383c1d998c0293f5f37ff5a7cdb2223d0 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Thu, 21 Aug 2014 22:32:47 +0300 Subject: [PATCH] INT-3492: Deprecate `@Payload` and `@Header(s)` JIRA: https://jira.spring.io/browse/INT-3492 Since `@Paylod` and `@Header(s)` annotations are in the Spring Framework, there is no more need to support them in Spring Integration. Deprecate them and leave for backward compatibility. Will be removed in future releases. Remove deprecated Gatewa's `#method` expression evaluation context variable Tested `gradlew clean testall` with and without changed to the tests. INT-3492: Add `MessagingAnnotationUtils#findMassagePartAnnotation` Move `MessagingAnnotationUtils` to the `org.springframework.integration.util` package --- .../amqp/inbound/ManualAckTests.java | 4 +- .../integration/annotation/Filter.java | 3 +- .../integration/annotation/Gateway.java | 6 +- .../integration/annotation/Header.java | 10 +- .../integration/annotation/Headers.java | 6 +- .../integration/annotation/Payload.java | 4 + .../integration/annotation/Router.java | 3 +- .../annotation/ServiceActivator.java | 3 +- .../integration/annotation/Splitter.java | 3 +- ...thodAnnotationPublisherMetadataSource.java | 48 +++++---- .../CorrelationStrategyFactoryBean.java | 2 +- .../config/MessagingGatewayRegistrar.java | 2 +- .../config/ReleaseStrategyFactoryBean.java | 2 +- ...AbstractMethodAnnotationPostProcessor.java | 1 + .../AggregatorAnnotationPostProcessor.java | 1 + .../BridgeFromAnnotationPostProcessor.java | 1 + .../BridgeToAnnotationPostProcessor.java | 1 + .../FilterAnnotationPostProcessor.java | 1 + ...ChannelAdapterAnnotationPostProcessor.java | 1 + .../MessagingAnnotationPostProcessor.java | 1 + .../RouterAnnotationPostProcessor.java | 1 + ...rviceActivatorAnnotationPostProcessor.java | 1 + .../SplitterAnnotationPostProcessor.java | 1 + .../GatewayMethodInboundMessageMapper.java | 79 +++++++-------- .../gateway/GatewayProxyFactoryBean.java | 7 +- .../integration/mapping/HeaderMapper.java | 2 +- .../MessagingAnnotationUtils.java | 40 +++++++- .../util/MessagingMethodInvokerHelper.java | 82 +++++++-------- .../CorrelationStrategyAdapterTests.java | 23 +++-- ...hodInvokingMessageGroupProcessorTests.java | 27 +++-- .../AnnotationConfigRegistrationTests.java | 6 +- ...MessagePublishingAnnotationUsageTests.java | 6 +- ...nnotationPublisherMetadataSourceTests.java | 6 +- .../aop/PublisherAnnotationAdvisorTests.java | 4 +- .../aop/PublisherExpressionTests.java | 4 +- .../configuration/EnableIntegrationTests.java | 2 +- .../gateway/GatewayInterfaceTests.java | 4 +- ...hodInboundMessageMapperToMessageTests.java | 8 +- .../GatewayProxyMessageMappingTests.java | 17 ++-- .../gateway/GatewayWithHeaderAnnotations.java | 9 +- ...ewayWithPayloadExpressionTests-context.xml | 2 +- .../GatewayWithPayloadExpressionTests.java | 4 +- .../gateway/HeaderEnrichedGatewayTests.java | 5 +- .../integration/gateway/TestService.java | 4 +- .../HeaderAnnotationTransformerTests.java | 11 ++- .../MethodInvokingHeaderEnricherTests.java | 5 +- ...vokingMessageProcessorAnnotationTests.java | 21 ++-- .../MethodInvokingMessageProcessorTests.java | 5 +- .../message/PayloadAndHeaderMappingTests.java | 8 +- .../router/MethodInvokingRouterTests.java | 99 +++++++++++-------- .../splitter/MethodInvokingSplitterTests.java | 24 ++--- .../MessageHistoryParameterTests.java | 8 +- .../MethodInvokingTransformerTests.java | 17 ++-- .../JpaOutboundGatewayTests-context.xml | 1 + .../jpa/outbound/JpaOutboundGatewayTests.java | 6 +- .../jpa/outbound/StudentService.java | 14 ++- .../ServiceActivatorOnMockitoMockTests.java | 19 ++-- 57 files changed, 411 insertions(+), 274 deletions(-) rename spring-integration-core/src/main/java/org/springframework/integration/{config/annotation => util}/MessagingAnnotationUtils.java (69%) diff --git a/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/inbound/ManualAckTests.java b/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/inbound/ManualAckTests.java index aad24c430a..32f4af910f 100644 --- a/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/inbound/ManualAckTests.java +++ b/spring-integration-amqp/src/test/java/org/springframework/integration/amqp/inbound/ManualAckTests.java @@ -39,9 +39,9 @@ import org.springframework.context.annotation.Configuration; import org.springframework.integration.amqp.AmqpHeaders; import org.springframework.integration.amqp.inbound.ManualAckTests.ManualAckConfig; import org.springframework.integration.amqp.rule.BrokerRunning; -import org.springframework.integration.annotation.Header; +import org.springframework.messaging.handler.annotation.Header; import org.springframework.integration.annotation.MessageEndpoint; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.EnableIntegration; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Filter.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Filter.java index 524c66015c..bb0add30ac 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Filter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Filter.java @@ -30,7 +30,8 @@ import java.lang.annotation.Target; * Message payload's type. Any type conversion supported by default or any * Converters registered with the "integrationConversionService" bean will be * applied to the Message payload if necessary. Header values can also be passed - * as Message parameters by using the {@link Header @Header} parameter annotation. + * as Message parameters by using the + * {@link org.springframework.messaging.handler.annotation.Header @Header} parameter annotation. *

* The return type of the annotated method must be a boolean (or Boolean). * diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Gateway.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Gateway.java index e9f6a6dfee..874531ded8 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Gateway.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Gateway.java @@ -32,9 +32,11 @@ import java.lang.annotation.Target; *

A method annotated with @Gateway may accept a single non-annotated * parameter of type {@link org.springframework.messaging.Message} * or of the intended Message payload type. Method parameters may be mapped - * to individual Message header values by using the {@link Header @Header} + * to individual Message header values by using the + * {@link org.springframework.messaging.handler.annotation.Header @Header} * parameter annotation. Alternatively, to pass the entire Message headers - * map, a Map-typed parameter may be annotated with {@link Headers}. + * map, a Map-typed parameter may be annotated with + * {@link org.springframework.messaging.handler.annotation.Headers}. * *

Return values from the annotated method may be of any type. If the * declared return value is not a Message, the reply Message's payload will be diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Header.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Header.java index 5c54bb2209..ce8bb48e20 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Header.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Header.java @@ -25,18 +25,22 @@ import java.lang.annotation.Target; /** * Annotation indicating that a method parameter's value should be * retrieved from the message headers. The value of the annotation - * can either be a header name (e.g., 'foo') or SpEL expression + * can either be a header name (e.g., 'foo') or SpEL expression * (e.g., 'payload.getCustomerId()') which is quite useful when - * the name of the header has to be dynamically computed. It also + * the name of the header has to be dynamically computed. It also * provides an optional 'required' property which * specifies whether the attribute value must be available within * the header. The default value for 'required' is true. - * + * * @author Mark Fisher + * + * @deprecated since 4.1 in favor of {@link org.springframework.messaging.handler.annotation.Header}. + * Will be removed in a future release. */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated public @interface Header { String value() default ""; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Headers.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Headers.java index 7b64494b7c..8a67f7f13f 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Headers.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Headers.java @@ -26,12 +26,16 @@ import java.lang.annotation.Target; * Annotation indicating that a method parameter's value should be mapped to or * from the message headers. The annotated parameter must be assignable to * {@link java.util.Map}, and all of the Map's keys must be Strings. - * + * * @author Mark Fisher + * + * @deprecated since 4.1 in favor of {@link org.springframework.messaging.handler.annotation.Headers}. + * Will be removed in a future release. */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated public @interface Headers { } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Payload.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Payload.java index f49247e3d7..79a947aec1 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Payload.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Payload.java @@ -33,10 +33,14 @@ import java.lang.annotation.Target; * * @author Oleg Zhurakousky * @since 2.0 + * + * @deprecated since 4.1 in favor of {@link org.springframework.messaging.handler.annotation.Payload}. + * Will be removed in a future release. */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated public @interface Payload { /** diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Router.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Router.java index abcea0cc8b..c688382ff2 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Router.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Router.java @@ -32,7 +32,8 @@ import java.lang.annotation.Target; * Message payload's type. Any type conversion supported by * {@link org.springframework.beans.SimpleTypeConverter} will be applied to * the Message payload if necessary. Header values can also be passed as - * Message parameters by using the {@link Header @Header} parameter annotation. + * Message parameters by using the + * {@link org.springframework.messaging.handler.annotation.Header @Header} parameter annotation. *

* Return values from the annotated method may be either a Collection or Array * whose elements are either diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/ServiceActivator.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/ServiceActivator.java index f67cbb92d6..4a612832ac 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/ServiceActivator.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/ServiceActivator.java @@ -31,7 +31,8 @@ import java.lang.annotation.Target; * Message payload's type. Any type conversion supported by * {@link org.springframework.beans.SimpleTypeConverter} will be applied to * the Message payload if necessary. Header values can also be passed as - * Message parameters by using the {@link Header @Header} parameter annotation. + * Message parameters by using the + * {@link org.springframework.messaging.handler.annotation.Header @Header} parameter annotation. *

* Return values from the annotated method may be of any type. If the return * value is not a Message, a reply Message will be created with that object diff --git a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Splitter.java b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Splitter.java index af773dff28..3c5e4080f3 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/annotation/Splitter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/annotation/Splitter.java @@ -31,7 +31,8 @@ import java.lang.annotation.Target; * Message payload's type. Any type conversion supported by * {@link org.springframework.beans.SimpleTypeConverter} will be applied to * the Message payload if necessary. Header values can also be passed as - * Message parameters by using the {@link Header @Header} parameter annotation. + * Message parameters by using the + * {@link org.springframework.messaging.handler.annotation.Header @Header} parameter annotation. *

* Return values from the annotated method may be either a Collection or Array * with elements of any type. If the type is not a Message, each will be used diff --git a/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java b/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java index ef6ed8c4dc..b466441afc 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSource.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,17 +26,18 @@ import java.util.Set; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Payload; import org.springframework.integration.annotation.Publisher; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** * An {@link PublisherMetadataSource} implementation that retrieves the channel * name and expression strings from an annotation. - * + * * @author Mark Fisher + * @author Artem Bilan * @since 2.0 */ public class MethodAnnotationPublisherMetadataSource implements PublisherMetadataSource { @@ -71,28 +72,39 @@ public class MethodAnnotationPublisherMetadataSource implements PublisherMetadat return (StringUtils.hasText(channelName) ? channelName : null); } + @SuppressWarnings("deprecation") public String getPayloadExpression(Method method) { String payloadExpression = null; - Payload methodPayloadAnnotation = AnnotationUtils.findAnnotation(method, Payload.class); - if (methodPayloadAnnotation != null) { - payloadExpression = StringUtils.hasText(methodPayloadAnnotation.value()) - ? methodPayloadAnnotation.value() - : "#" + PublisherMetadataSource.RETURN_VALUE_VARIABLE_NAME; + Annotation methodPayloadAnnotation = + AnnotationUtils.findAnnotation(method, org.springframework.integration.annotation.Payload.class); + if (methodPayloadAnnotation == null) { + methodPayloadAnnotation = AnnotationUtils.findAnnotation(method, Payload.class); } + + if (methodPayloadAnnotation != null) { + payloadExpression = getAnnotationValue(methodPayloadAnnotation, null, String.class); + if (!StringUtils.hasText(payloadExpression)) { + payloadExpression = "#" + PublisherMetadataSource.RETURN_VALUE_VARIABLE_NAME; + } + } + Annotation[][] annotationArray = method.getParameterAnnotations(); for (int i = 0; i < annotationArray.length; i++) { Annotation[] parameterAnnotations = annotationArray[i]; for (Annotation currentAnnotation : parameterAnnotations) { - if (Payload.class.equals(currentAnnotation.annotationType())) { + if (org.springframework.integration.annotation.Payload.class.equals(currentAnnotation.annotationType()) + || Payload.class.equals(currentAnnotation.annotationType())) { Assert.state(payloadExpression == null, - "@Payload can be used at most once on a @Publisher method, either at method-level or on a single parameter"); - Assert.state("".equals(((Payload) currentAnnotation).value()), + "@Payload can be used at most once on a @Publisher method, " + + "either at method-level or on a single parameter"); + Assert.state("".equals(AnnotationUtils.getValue(currentAnnotation)), "@Payload on a parameter for a @Publisher method may not contain an expression"); payloadExpression = "#" + PublisherMetadataSource.ARGUMENT_MAP_VARIABLE_NAME + "[" + i + "]"; } } } - if (payloadExpression == null || payloadExpression.contains("#" + PublisherMetadataSource.RETURN_VALUE_VARIABLE_NAME)) { + if (payloadExpression == null + || payloadExpression.contains("#" + PublisherMetadataSource.RETURN_VALUE_VARIABLE_NAME)) { Assert.isTrue(!void.class.equals(method.getReturnType()), "When defining @Publisher on a void-returning method, an explicit payload " + "expression that does not rely upon a #return value is required."); @@ -100,6 +112,7 @@ public class MethodAnnotationPublisherMetadataSource implements PublisherMetadat return payloadExpression; } + @SuppressWarnings("deprecation") public Map getHeaderExpressions(Method method) { Map headerExpressions = new HashMap(); String[] parameterNames = this.parameterNameDiscoverer.getParameterNames(method); @@ -107,13 +120,14 @@ public class MethodAnnotationPublisherMetadataSource implements PublisherMetadat for (int i = 0; i < annotationArray.length; i++) { Annotation[] parameterAnnotations = annotationArray[i]; for (Annotation currentAnnotation : parameterAnnotations) { - if (Header.class.equals(currentAnnotation.annotationType())) { - Header headerAnnotation = (Header) currentAnnotation; - String name = headerAnnotation.value(); + if (org.springframework.integration.annotation.Header.class.equals(currentAnnotation.annotationType()) + || Header.class.equals(currentAnnotation.annotationType())) { + String name = getAnnotationValue(currentAnnotation, null, String.class); if (!StringUtils.hasText(name)) { name = parameterNames[i]; } - headerExpressions.put(name, "#" + PublisherMetadataSource.ARGUMENT_MAP_VARIABLE_NAME + "[" + i + "]"); + headerExpressions.put(name, + "#" + PublisherMetadataSource.ARGUMENT_MAP_VARIABLE_NAME + "[" + i + "]"); } } } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/CorrelationStrategyFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/config/CorrelationStrategyFactoryBean.java index 75d1aef62c..9fdf18cd97 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/CorrelationStrategyFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/CorrelationStrategyFactoryBean.java @@ -22,7 +22,7 @@ import org.springframework.integration.IntegrationMessageHeaderAccessor; import org.springframework.integration.aggregator.CorrelationStrategy; import org.springframework.integration.aggregator.HeaderAttributeCorrelationStrategy; import org.springframework.integration.aggregator.MethodInvokingCorrelationStrategy; -import org.springframework.integration.config.annotation.MessagingAnnotationUtils; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.util.StringUtils; /** diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java b/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java index 0e645efa20..b920a1e5cd 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java @@ -38,7 +38,7 @@ import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; import org.springframework.expression.common.LiteralExpression; import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.integration.config.annotation.MessagingAnnotationUtils; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.integration.gateway.GatewayMethodMetadata; import org.springframework.integration.gateway.GatewayProxyFactoryBean; import org.springframework.util.Assert; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/ReleaseStrategyFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/config/ReleaseStrategyFactoryBean.java index 88b493f5df..06d88d0a04 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/ReleaseStrategyFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/ReleaseStrategyFactoryBean.java @@ -24,7 +24,7 @@ import org.springframework.beans.factory.FactoryBean; import org.springframework.integration.aggregator.MethodInvokingReleaseStrategy; import org.springframework.integration.aggregator.ReleaseStrategy; import org.springframework.integration.aggregator.SequenceSizeReleaseStrategy; -import org.springframework.integration.config.annotation.MessagingAnnotationUtils; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.util.StringUtils; /** diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AbstractMethodAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AbstractMethodAnnotationPostProcessor.java index 67d4716231..c848ac8593 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AbstractMethodAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AbstractMethodAnnotationPostProcessor.java @@ -49,6 +49,7 @@ import org.springframework.integration.endpoint.PollingConsumer; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.scheduling.PollerMetadata; import org.springframework.integration.support.channel.BeanFactoryChannelResolver; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.PollableChannel; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AggregatorAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AggregatorAnnotationPostProcessor.java index f157c4d62f..fa2bfd4dbb 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AggregatorAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/AggregatorAnnotationPostProcessor.java @@ -30,6 +30,7 @@ import org.springframework.integration.annotation.Aggregator; import org.springframework.integration.annotation.CorrelationStrategy; import org.springframework.integration.annotation.ReleaseStrategy; import org.springframework.integration.store.SimpleMessageStore; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageHandler; import org.springframework.util.StringUtils; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeFromAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeFromAnnotationPostProcessor.java index ba980769c6..693991889a 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeFromAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeFromAnnotationPostProcessor.java @@ -28,6 +28,7 @@ import org.springframework.core.env.Environment; import org.springframework.integration.annotation.BridgeFrom; import org.springframework.integration.annotation.BridgeTo; import org.springframework.integration.handler.BridgeHandler; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeToAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeToAnnotationPostProcessor.java index af4e71a50e..36027856b4 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeToAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/BridgeToAnnotationPostProcessor.java @@ -28,6 +28,7 @@ import org.springframework.integration.annotation.BridgeFrom; import org.springframework.integration.annotation.BridgeTo; import org.springframework.integration.endpoint.AbstractEndpoint; import org.springframework.integration.handler.BridgeHandler; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/FilterAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/FilterAnnotationPostProcessor.java index 8c6fded2c4..cd7566b710 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/FilterAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/FilterAnnotationPostProcessor.java @@ -28,6 +28,7 @@ import org.springframework.integration.annotation.Filter; import org.springframework.integration.core.MessageSelector; import org.springframework.integration.filter.MessageFilter; import org.springframework.integration.filter.MethodInvokingSelector; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; import org.springframework.util.StringUtils; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/InboundChannelAdapterAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/InboundChannelAdapterAnnotationPostProcessor.java index 84e0f374fc..0675b6d234 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/InboundChannelAdapterAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/InboundChannelAdapterAnnotationPostProcessor.java @@ -30,6 +30,7 @@ import org.springframework.integration.config.IntegrationConfigUtils; import org.springframework.integration.core.MessageSource; import org.springframework.integration.endpoint.MethodInvokingMessageSource; import org.springframework.integration.endpoint.SourcePollingChannelAdapter; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; 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 5f1fabd6db..31f11f84f8 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 @@ -54,6 +54,7 @@ import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.annotation.Splitter; import org.springframework.integration.annotation.Transformer; import org.springframework.integration.endpoint.AbstractEndpoint; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.stereotype.Component; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java index 4cdfc3eec8..bb20537b33 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/RouterAnnotationPostProcessor.java @@ -29,6 +29,7 @@ import org.springframework.core.env.Environment; import org.springframework.integration.annotation.Router; import org.springframework.integration.router.AbstractMessageRouter; import org.springframework.integration.router.MethodInvokingRouter; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/ServiceActivatorAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/ServiceActivatorAnnotationPostProcessor.java index fcc7a20a78..2c4fd7f799 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/ServiceActivatorAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/ServiceActivatorAnnotationPostProcessor.java @@ -27,6 +27,7 @@ import org.springframework.core.env.Environment; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.handler.ServiceActivatingHandler; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandler; import org.springframework.util.StringUtils; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/SplitterAnnotationPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/SplitterAnnotationPostProcessor.java index 3872dbb44d..67e8965da6 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/SplitterAnnotationPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/SplitterAnnotationPostProcessor.java @@ -27,6 +27,7 @@ import org.springframework.core.env.Environment; import org.springframework.integration.annotation.Splitter; import org.springframework.integration.splitter.AbstractMessageSplitter; import org.springframework.integration.splitter.MethodInvokingSplitter; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; import org.springframework.util.StringUtils; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapper.java b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapper.java index 9f53ebb64e..244503d79f 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,21 +31,23 @@ import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.annotation.AnnotationUtils; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; -import org.springframework.integration.annotation.Payload; import org.springframework.integration.expression.ExpressionUtils; import org.springframework.integration.mapping.InboundMessageMapper; import org.springframework.integration.mapping.MessageMappingException; import org.springframework.integration.support.AbstractIntegrationMessageBuilder; import org.springframework.integration.support.DefaultMessageBuilderFactory; import org.springframework.integration.support.MessageBuilderFactory; +import org.springframework.integration.util.MessagingAnnotationUtils; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -72,6 +74,7 @@ import org.springframework.util.StringUtils; * @author Iwein Fuld * @author Oleg Zhurakousky * @author Gary Russell + * @author Artem Bilan * @since 2.0 */ class GatewayMethodInboundMessageMapper implements InboundMessageMapper, BeanFactoryAware { @@ -167,7 +170,8 @@ class GatewayMethodInboundMessageMapper implements InboundMessageMapper evaluateHeaders(EvaluationContext methodInvocationEvaluationContext, Map headerExpressions) { + private Map evaluateHeaders(EvaluationContext methodInvocationEvaluationContext, + Map headerExpressions) { Map evaluatedHeaders = new HashMap(); for (Map.Entry entry : headerExpressions.entrySet()) { Object value = entry.getValue().getValue(methodInvocationEvaluationContext); @@ -182,9 +186,6 @@ class GatewayMethodInboundMessageMapper implements InboundMessageMapper type = annotation.annotationType(); - if (type.equals(Payload.class) || type.equals(Header.class) || type.equals(Headers.class)) { - if (match != null) { - throw new MessagingException("At most one parameter annotation can be provided for message mapping, " + - "but found two: [" + match.annotationType().getName() + "] and [" + annotation.annotationType().getName() + "]"); - } - match = annotation; - } - } - return match; - } private void copyHeaders(Map argumentValue, Map headers) { for (Object key : argumentValue.keySet()) { @@ -237,8 +221,8 @@ class GatewayMethodInboundMessageMapper implements InboundMessageMapper toMessage(MethodArgsHolder holder) throws Exception { Object messageOrPayload = null; boolean foundPayloadAnnotation = false; @@ -279,35 +268,42 @@ class GatewayMethodInboundMessageMapper implements InboundMessageMapper headers = new HashMap(); if (GatewayMethodInboundMessageMapper.this.payloadExpression != null) { - messageOrPayload = GatewayMethodInboundMessageMapper.this.payloadExpression.getValue(methodInvocationEvaluationContext); + messageOrPayload = + GatewayMethodInboundMessageMapper.this.payloadExpression.getValue(methodInvocationEvaluationContext); } for (int i = 0; i < GatewayMethodInboundMessageMapper.this.parameterList.size(); i++) { Object argumentValue = arguments[i]; MethodParameter methodParameter = GatewayMethodInboundMessageMapper.this.parameterList.get(i); - Annotation annotation = GatewayMethodInboundMessageMapper.this.findMappingAnnotation(methodParameter.getParameterAnnotations()); + Annotation annotation = + MessagingAnnotationUtils.findMessagePartAnnotation(methodParameter.getParameterAnnotations()); if (annotation != null) { - if (annotation.annotationType().equals(Payload.class)) { + if (annotation.annotationType().equals(org.springframework.integration.annotation.Payload.class) + || annotation.annotationType().equals(Payload.class)) { if (messageOrPayload != null) { GatewayMethodInboundMessageMapper.this.throwExceptionForMultipleMessageOrPayloadParameters(methodParameter); } - String expression = ((Payload) annotation).value(); + String expression = (String) AnnotationUtils.getValue(annotation); if (!StringUtils.hasText(expression)) { messageOrPayload = argumentValue; } else { - messageOrPayload = GatewayMethodInboundMessageMapper.this.evaluatePayloadExpression(expression, argumentValue); + messageOrPayload = + GatewayMethodInboundMessageMapper.this.evaluatePayloadExpression(expression, argumentValue); } foundPayloadAnnotation = true; } - else if (annotation.annotationType().equals(Header.class)) { - Header headerAnnotation = (Header) annotation; - String headerName = GatewayMethodInboundMessageMapper.this.determineHeaderName(headerAnnotation, methodParameter); - if (headerAnnotation.required() && argumentValue == null) { - throw new IllegalArgumentException("Received null argument value for required header: '" + headerName + "'"); + else if (annotation.annotationType().equals(org.springframework.integration.annotation.Header.class) + || annotation.annotationType().equals(Header.class)) { + String headerName = + GatewayMethodInboundMessageMapper.this.determineHeaderName(annotation, methodParameter); + if ((Boolean) AnnotationUtils.getValue(annotation, "required") && argumentValue == null) { + throw new IllegalArgumentException("Received null argument value for required header: '" + + headerName + "'"); } headers.put(headerName, argumentValue); } - else if (annotation.annotationType().equals(Headers.class)) { + else if (annotation.annotationType().equals(org.springframework.integration.annotation.Headers.class) + || annotation.annotationType().equals(Headers.class)) { if (argumentValue != null) { if (!(argumentValue instanceof Map)) { throw new IllegalArgumentException("@Headers annotation is only valid for Map-typed parameters"); @@ -337,7 +333,8 @@ class GatewayMethodInboundMessageMapper implements InboundMessageMapper builder = (messageOrPayload instanceof Message) ? GatewayMethodInboundMessageMapper.this.messageBuilderFactory.fromMessage((Message) messageOrPayload) : GatewayMethodInboundMessageMapper.this.messageBuilderFactory.withPayload(messageOrPayload); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java index 9414c2426b..ce15063c78 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayProxyFactoryBean.java @@ -46,7 +46,6 @@ import org.springframework.expression.common.LiteralExpression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.integration.annotation.Gateway; import org.springframework.integration.annotation.GatewayHeader; -import org.springframework.integration.annotation.Payload; import org.springframework.integration.endpoint.AbstractEndpoint; import org.springframework.integration.history.TrackableComponent; import org.springframework.integration.support.channel.BeanFactoryChannelResolver; @@ -55,6 +54,7 @@ import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessagingException; import org.springframework.messaging.core.DestinationResolver; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -349,7 +349,10 @@ public class GatewayProxyFactoryBean extends AbstractEndpoint boolean shouldReply = returnType != void.class; int paramCount = method.getParameterTypes().length; Object response = null; - boolean hasPayloadExpression = method.isAnnotationPresent(Payload.class); + @SuppressWarnings("deprecation") + boolean hasPayloadExpression = + method.isAnnotationPresent(org.springframework.integration.annotation.Payload.class) + || method.isAnnotationPresent(Payload.class); if (!hasPayloadExpression && this.methodMetadataMap != null) { // check for the method metadata next GatewayMethodMetadata metadata = this.methodMetadataMap.get(method.getName()); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/mapping/HeaderMapper.java b/spring-integration-core/src/main/java/org/springframework/integration/mapping/HeaderMapper.java index 0f7d3852cf..b83f8b2e46 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/mapping/HeaderMapper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/mapping/HeaderMapper.java @@ -24,7 +24,7 @@ import org.springframework.messaging.MessageHeaders; * Generic strategy interface for mapping {@link MessageHeaders} to and from other * types of objects. This would typically be used by adapters where the "other type" * has a concept of headers or properties (HTTP, JMS, AMQP, etc). - * + * * @author Mark Fisher * * @param type of the instance to and from which headers will be mapped. diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/MessagingAnnotationUtils.java b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingAnnotationUtils.java similarity index 69% rename from spring-integration-core/src/main/java/org/springframework/integration/config/annotation/MessagingAnnotationUtils.java rename to spring-integration-core/src/main/java/org/springframework/integration/util/MessagingAnnotationUtils.java index 500cf9b3a7..c5ef3e94db 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/annotation/MessagingAnnotationUtils.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingAnnotationUtils.java @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.integration.config.annotation; + +package org.springframework.integration.util; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -23,6 +24,10 @@ import java.util.concurrent.atomic.AtomicReference; import org.springframework.aop.support.AopUtils; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.messaging.MessagingException; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -90,6 +95,39 @@ public final class MessagingAnnotationUtils { return reference.get(); } + /** + * Find the one of {@link Payload}, {@link Header} or {@link Headers} annotation from + * the provided {@code annotations} array. + * @param annotations the annotations to scan. + * @return the matched annotation or {@code null}. + * @throws MessagingException if more than one of {@link Payload}, {@link Header} + * or {@link Headers} annotations are presented. + */ + @SuppressWarnings("deprecation") + public static Annotation findMessagePartAnnotation(Annotation[] annotations) { + if (annotations == null || annotations.length == 0) { + return null; + } + Annotation match = null; + for (Annotation annotation : annotations) { + Class type = annotation.annotationType(); + if (type.equals(org.springframework.integration.annotation.Payload.class) + || type.equals(Payload.class) + || type.equals(org.springframework.integration.annotation.Header.class) + || type.equals(Header.class) + || type.equals(org.springframework.integration.annotation.Headers.class) + || type.equals(Headers.class)) { + if (match != null) { + throw new MessagingException("At most one parameter annotation can be provided " + + "for message mapping, but found two: [" + match.annotationType().getName() + "] and [" + + annotation.annotationType().getName() + "]"); + } + match = annotation; + } + } + return match; + } + private static Class getTargetClass(Object targetObject) { Class targetClass = targetObject.getClass(); if (AopUtils.isAopProxy(targetObject)) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java index c4fb6c560b..54e1b68010 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java @@ -43,6 +43,7 @@ import org.springframework.aop.support.AopUtils; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.convert.TypeDescriptor; import org.springframework.expression.EvaluationException; @@ -50,14 +51,13 @@ import org.springframework.expression.Expression; import org.springframework.expression.TypeConverter; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; -import org.springframework.integration.annotation.Payload; import org.springframework.integration.annotation.Payloads; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandlingException; -import org.springframework.messaging.MessagingException; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; @@ -235,7 +235,8 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator if (method instanceof Method) { context.registerMethodFilter(targetType, new FixedMethodFilter((Method) method)); if (expectedType != null) { - Assert.state(context.getTypeConverter().canConvert(TypeDescriptor.valueOf(((Method) method).getReturnType()), + Assert.state(context.getTypeConverter() + .canConvert(TypeDescriptor.valueOf(((Method) method).getReturnType()), TypeDescriptor.valueOf(expectedType)), "Cannot convert to expected type (" + expectedType + ") from " + method); } @@ -250,13 +251,15 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator context.setVariable("target", targetObject); } - private boolean canReturnExpectedType(AnnotatedMethodFilter filter, Class targetType, TypeConverter typeConverter) { + private boolean canReturnExpectedType(AnnotatedMethodFilter filter, Class targetType, + TypeConverter typeConverter) { if (expectedType == null) { return true; } List methods = filter.filter(Arrays.asList(ReflectionUtils.getAllDeclaredMethods(targetType))); for (Method method : methods) { - if (typeConverter.canConvert(TypeDescriptor.valueOf(method.getReturnType()), TypeDescriptor.valueOf(expectedType))) { + if (typeConverter.canConvert(TypeDescriptor.valueOf(method.getReturnType()), + TypeDescriptor.valueOf(expectedType))) { return true; } } @@ -413,7 +416,8 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator if ("org.springframework.integration.gateway.RequestReplyExchanger".equals(iface.getName())) { frameworkMethods.add(targetClass.getMethod("exchange", Message.class)); if (logger.isDebugEnabled()) { - logger.debug(targetObject.getClass() + ": Ambiguous fallback methods; using RequestReplyExchanger.exchange()"); + logger.debug(targetObject.getClass() + + ": Ambiguous fallback methods; using RequestReplyExchanger.exchange()"); } } } @@ -431,7 +435,8 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator try { Assert.state(!fallbackMethods.isEmpty() || !fallbackMessageMethods.isEmpty(), - "Target object of type [" + this.targetObject.getClass() + "] has no eligible methods for handling Messages."); + "Target object of type [" + this.targetObject.getClass() + + "] has no eligible methods for handling Messages."); } catch (Exception e) { //TODO backward compatibility @@ -536,7 +541,8 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator private static final SpelExpressionParser EXPRESSION_PARSER = new SpelExpressionParser(); - private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new LocalVariableTableParameterNameDiscoverer(); + private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = + new LocalVariableTableParameterNameDiscoverer(); private static final TypeDescriptor messageTypeDescriptor = TypeDescriptor.valueOf(Message.class); @@ -585,6 +591,7 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator return this.method.toString(); } + @SuppressWarnings("deprecation") private Expression generateExpression(Method method) { StringBuilder sb = new StringBuilder("#target." + method.getName() + "("); Class[] parameterTypes = method.getParameterTypes(); @@ -597,12 +604,14 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator MethodParameter methodParameter = new MethodParameter(method, i); TypeDescriptor parameterTypeDescriptor = new TypeDescriptor(methodParameter); Class parameterType = parameterTypeDescriptor.getObjectType(); - Annotation mappingAnnotation = findMappingAnnotation(parameterAnnotations[i]); + Annotation mappingAnnotation = + MessagingAnnotationUtils.findMessagePartAnnotation(parameterAnnotations[i]); if (mappingAnnotation != null) { Class annotationType = mappingAnnotation.annotationType(); - if (annotationType.equals(Payload.class)) { + if (annotationType.equals(org.springframework.integration.annotation.Payload.class) + || annotationType.equals(Payload.class)) { sb.append("payload"); - String qualifierExpression = ((Payload) mappingAnnotation).value(); + String qualifierExpression = (String) AnnotationUtils.getValue(mappingAnnotation); if (StringUtils.hasText(qualifierExpression)) { sb.append("." + qualifierExpression); } @@ -621,14 +630,15 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator this.setExclusiveTargetParameterType(parameterTypeDescriptor, methodParameter); } } - else if (annotationType.equals(Headers.class)) { + else if (annotationType.equals(org.springframework.integration.annotation.Headers.class) + || annotationType.equals(Headers.class)) { Assert.isTrue(Map.class.isAssignableFrom(parameterType), "The @Headers annotation can only be applied to a Map-typed parameter."); sb.append("headers"); } - else if (annotationType.equals(Header.class)) { - Header headerAnnotation = (Header) mappingAnnotation; - sb.append(this.determineHeaderExpression(headerAnnotation, methodParameter)); + else if (annotationType.equals(org.springframework.integration.annotation.Header.class) + || annotationType.equals(Header.class)) { + sb.append(this.determineHeaderExpression(mappingAnnotation, methodParameter)); } } else if (parameterTypeDescriptor.isAssignableTo(messageTypeDescriptor)) { @@ -636,8 +646,8 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator sb.append("message"); this.setExclusiveTargetParameterType(parameterTypeDescriptor, methodParameter); } - else if ((parameterTypeDescriptor.isAssignableTo(messageListTypeDescriptor) || parameterTypeDescriptor - .isAssignableTo(messageArrayTypeDescriptor))) { + else if ((parameterTypeDescriptor.isAssignableTo(messageListTypeDescriptor) + || parameterTypeDescriptor.isAssignableTo(messageArrayTypeDescriptor))) { sb.append("messages"); this.setExclusiveTargetParameterType(parameterTypeDescriptor, methodParameter); } @@ -704,31 +714,13 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator return EXPRESSION_PARSER.parseExpression(sb.toString()); } - private Annotation findMappingAnnotation(Annotation[] annotations) { - if (annotations == null || annotations.length == 0) { - return null; - } - Annotation match = null; - for (Annotation annotation : annotations) { - Class type = annotation.annotationType(); - if (type.equals(Payload.class) || type.equals(Payloads.class) || type.equals(Header.class) || type.equals(Headers.class)) { - if (match != null) { - throw new MessagingException( - "At most one parameter annotation can be provided for message mapping, " - + "but found two: [" + match.annotationType().getName() + "] and [" - + annotation.annotationType().getName() + "]"); - } - match = annotation; - } - } - return match; - } - - private String determineHeaderExpression(Header headerAnnotation, MethodParameter methodParameter) { + private String determineHeaderExpression(Annotation headerAnnotation, MethodParameter methodParameter) { methodParameter.initParameterNameDiscovery(PARAMETER_NAME_DISCOVERER); String headerName = null; String relativeExpression = ""; - String valueAttribute = headerAnnotation.value(); + AnnotationAttributes annotationAttributes = + (AnnotationAttributes) AnnotationUtils.getAnnotationAttributes(headerAnnotation); + String valueAttribute = annotationAttributes.getString(AnnotationUtils.VALUE); if (!StringUtils.hasText(valueAttribute)) { headerName = methodParameter.getParameterName(); } @@ -746,13 +738,15 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator + "disabled or header name is not explicitly provided via @Header annotation."); String headerRetrievalExpression = "headers['" + headerName + "']"; String fullHeaderExpression = headerRetrievalExpression + relativeExpression; - String fallbackExpression = (headerAnnotation.required()) - ? "T(org.springframework.util.Assert).isTrue(false, 'required header not available: " + headerName + "')" + String fallbackExpression = (annotationAttributes.getBoolean("required")) + ? "T(org.springframework.util.Assert).isTrue(false, 'required header not available: " + + headerName + "')" : "null"; return headerRetrievalExpression + " != null ? " + fullHeaderExpression + " : " + fallbackExpression; } - private synchronized void setExclusiveTargetParameterType(TypeDescriptor targetParameterType, MethodParameter methodParameter) { + private synchronized void setExclusiveTargetParameterType(TypeDescriptor targetParameterType, + MethodParameter methodParameter) { if (this.targetParameterTypeDescriptor != null) { throw new IneligibleMethodException("Found more than one parameter type candidate: [" + this.targetParameterTypeDescriptor + "] and [" + targetParameterType + "]"); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aggregator/CorrelationStrategyAdapterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aggregator/CorrelationStrategyAdapterTests.java index ef855d10fa..89ed76e7d2 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aggregator/CorrelationStrategyAdapterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aggregator/CorrelationStrategyAdapterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,20 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.integration.aggregator; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; -import org.springframework.messaging.Message; -import org.springframework.integration.annotation.Header; + import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.Message; +import org.springframework.messaging.handler.annotation.Header; import org.springframework.util.ReflectionUtils; /** * @author Dave Syer - * + * */ public class CorrelationStrategyAdapterTests { @@ -39,7 +41,8 @@ public class CorrelationStrategyAdapterTests { @Test public void testMethodName() { - MethodInvokingCorrelationStrategy adapter = new MethodInvokingCorrelationStrategy(new SimpleMessageCorrelator(), "getKey"); + MethodInvokingCorrelationStrategy adapter = + new MethodInvokingCorrelationStrategy(new SimpleMessageCorrelator(), "getKey"); assertEquals("b", adapter.getCorrelationKey(message)); } @@ -52,13 +55,15 @@ public class CorrelationStrategyAdapterTests { @Test public void testCorrelationStrategyAdapterPojoMethod() { - MethodInvokingCorrelationStrategy adapter = new MethodInvokingCorrelationStrategy(new SimplePojoCorrelator(), "getKey"); + MethodInvokingCorrelationStrategy adapter = + new MethodInvokingCorrelationStrategy(new SimplePojoCorrelator(), "getKey"); assertEquals("foo", adapter.getCorrelationKey(message)); } @Test public void testHeaderPojoMethod() { - MethodInvokingCorrelationStrategy adapter = new MethodInvokingCorrelationStrategy(new SimpleHeaderCorrelator(), "getKey"); + MethodInvokingCorrelationStrategy adapter = + new MethodInvokingCorrelationStrategy(new SimpleHeaderCorrelator(), "getKey"); assertEquals("b", adapter.getCorrelationKey(message)); } @@ -74,6 +79,7 @@ public class CorrelationStrategyAdapterTests { public String getKey(@Header("a") String header, @Header("c") String other) { return header + other; } + } private static class SimpleHeaderCorrelator { @@ -81,6 +87,7 @@ public class CorrelationStrategyAdapterTests { public String getKey(@Header("a") String header) { return header; } + } private static class SimplePojoCorrelator { @@ -88,6 +95,7 @@ public class CorrelationStrategyAdapterTests { public String getKey(String message) { return message; } + } private static class SimpleMessageCorrelator { @@ -95,6 +103,7 @@ public class CorrelationStrategyAdapterTests { public String getKey(Message message) { return (String) message.getHeaders().get("a"); } + } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java index 53b0235b01..ab7a731d10 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aggregator/MethodInvokingMessageGroupProcessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,13 @@ package org.springframework.integration.aggregator; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.when; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -28,31 +35,23 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; + import org.springframework.aop.framework.ProxyFactory; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.convert.support.GenericConversionService; -import org.springframework.messaging.Message; import org.springframework.integration.annotation.Aggregator; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; import org.springframework.integration.annotation.Payloads; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.endpoint.EventDrivenConsumer; -import org.springframework.messaging.support.GenericMessage; import org.springframework.integration.store.MessageGroup; import org.springframework.integration.store.SimpleMessageGroup; import org.springframework.integration.support.MessageBuilder; - -import static org.junit.Assert.assertTrue; -import static org.hamcrest.CoreMatchers.is; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import static org.mockito.Mockito.when; +import org.springframework.messaging.Message; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.support.GenericMessage; @RunWith(MockitoJUnitRunner.class) public class MethodInvokingMessageGroupProcessorTests { diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests.java index 8666f0f41d..883fe0f55d 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.Message; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.Publisher; import org.springframework.integration.channel.QueueChannel; import org.springframework.test.context.ContextConfiguration; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java index adbcfb2313..a38e12827e 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingAnnotationUsageTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,8 +24,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.Message; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.Publisher; import org.springframework.integration.channel.QueueChannel; import org.springframework.test.context.ContextConfiguration; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java index 57562568fc..a7d31139e7 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,8 +24,8 @@ import java.util.Map; import org.junit.Test; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.Publisher; /** diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherAnnotationAdvisorTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherAnnotationAdvisorTests.java index ea75a1edb4..bf8349ab70 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherAnnotationAdvisorTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherAnnotationAdvisorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ import org.junit.Test; import org.springframework.aop.framework.ProxyFactory; import org.springframework.context.support.StaticApplicationContext; import org.springframework.messaging.Message; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.Publisher; import org.springframework.integration.channel.QueueChannel; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherExpressionTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherExpressionTests.java index e1212e8df5..12fc706b30 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherExpressionTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/PublisherExpressionTests.java @@ -25,8 +25,8 @@ import org.junit.Test; import org.springframework.aop.framework.ProxyFactory; import org.springframework.context.support.StaticApplicationContext; import org.springframework.expression.EvaluationContext; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.Publisher; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.IntegrationEvaluationContextFactoryBean; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java index 701abb9351..0e8c054acb 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java @@ -72,7 +72,7 @@ import org.springframework.integration.annotation.InboundChannelAdapter; import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.integration.annotation.MessageEndpoint; import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.Poller; import org.springframework.integration.annotation.Publisher; import org.springframework.integration.annotation.ServiceActivator; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayInterfaceTests.java b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayInterfaceTests.java index c8e0440aa4..935e19714e 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayInterfaceTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayInterfaceTests.java @@ -46,10 +46,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.annotation.BridgeTo; import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.Header; +import org.springframework.messaging.handler.annotation.Header; import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.support.MessageBuilder; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapperToMessageTests.java b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapperToMessageTests.java index 46dc28b812..755e91f30f 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapperToMessageTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayMethodInboundMessageMapperToMessageTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,9 +31,9 @@ import org.springframework.expression.Expression; import org.springframework.expression.common.LiteralExpression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.messaging.Message; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.mapping.MessageMappingException; import org.springframework.integration.support.MessageBuilder; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayProxyMessageMappingTests.java b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayProxyMessageMappingTests.java index 896886c4a6..0c978e4676 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayProxyMessageMappingTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayProxyMessageMappingTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,18 +28,19 @@ import org.junit.Test; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.support.GenericApplicationContext; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessagingException; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.IntegrationEvaluationContextFactoryBean; import org.springframework.integration.context.IntegrationContextUtils; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessagingException; /** * @author Mark Fisher * @author Gary Russell + * @author Artem Bilan * @since 2.0 */ public class GatewayProxyMessageMappingTests { @@ -214,6 +215,10 @@ public class GatewayProxyMessageMappingTests { void payloadAndHeaderMapWithoutAnnotations(String s, Map map); + @SuppressWarnings("deprecation") + void payloadAndHeaderMapWithAnnotationsDeprecated(@org.springframework.integration.annotation.Payload String s, + @org.springframework.integration.annotation.Headers Map map); + void payloadAndHeaderMapWithAnnotations(@Payload String s, @Headers Map map); void headerValuesAndPayloadWithAnnotations(@Header("k1") String x, @Payload String s, @Header("k2") String y); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithHeaderAnnotations.java b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithHeaderAnnotations.java index 276fa313b5..bf9bc2d8b3 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithHeaderAnnotations.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithHeaderAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +20,11 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.integration.IntegrationMessageHeaderAccessor; -import org.springframework.integration.annotation.Header; +import org.springframework.messaging.handler.annotation.Header; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -49,7 +50,9 @@ public class GatewayWithHeaderAnnotations { public static interface TestService { // wrt INT-1205, priority no longer has a $ prefix, so here we are testing the $custom header as well - public String test(String str, @Header(IntegrationMessageHeaderAccessor.PRIORITY) int priority, @Header("$custom") String custom); + public String test(String str, @Header(IntegrationMessageHeaderAccessor.PRIORITY) int priority, + @Header("$custom") String custom); + } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithPayloadExpressionTests-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithPayloadExpressionTests-context.xml index 873794ec20..8c0ce40287 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithPayloadExpressionTests-context.xml +++ b/spring-integration-core/src/test/java/org/springframework/integration/gateway/GatewayWithPayloadExpressionTests-context.xml @@ -10,7 +10,7 @@ - + requestReplyWithMessageReturnValue(String input); - @Payload("#method + #args.length") + @Payload("#gatewayMethod.name + #args.length") String requestReplyWithPayloadAnnotation(); Future> async(String s); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/handler/HeaderAnnotationTransformerTests.java b/spring-integration-core/src/test/java/org/springframework/integration/handler/HeaderAnnotationTransformerTests.java index 4a013c3832..294dd81ce4 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/handler/HeaderAnnotationTransformerTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/handler/HeaderAnnotationTransformerTests.java @@ -24,12 +24,12 @@ import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.integration.IntegrationMessageHeaderAccessor; -import org.springframework.integration.annotation.Header; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.transformer.MessageTransformingHandler; import org.springframework.integration.transformer.MethodInvokingTransformer; import org.springframework.messaging.Message; +import org.springframework.messaging.handler.annotation.Header; /** * @author Mark Fisher @@ -110,17 +110,18 @@ public class HeaderAnnotationTransformerTests { return payload.toString() + correlationId.toString(); } - public String appendFoo(Object payload, @Header(value = "foo") Object header) { + public String appendFoo(Object payload, @Header("foo") Object header) { return payload.toString() + header.toString(); } - public String evalCorrelationId(@Header(value = IntegrationMessageHeaderAccessor.CORRELATION_ID + ".toUpperCase()") String result) { - return result.toString(); + public String evalCorrelationId(@Header(IntegrationMessageHeaderAccessor.CORRELATION_ID + ".toUpperCase()") String result) { + return result; } public String evalFoo(@Header(value = "foo.toUpperCase()", required = true) String result) { - return result.toString(); + return result; } + } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingHeaderEnricherTests.java b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingHeaderEnricherTests.java index f5f3b3897e..f38d84a188 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingHeaderEnricherTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingHeaderEnricherTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import java.util.Map; import org.junit.Test; import org.springframework.messaging.Message; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.support.MessageBuilder; import org.springframework.integration.transformer.HeaderEnricher; @@ -98,6 +98,7 @@ public class MethodInvokingHeaderEnricherTests { map.put("bar", "ABC"); return map; } + } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorAnnotationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorAnnotationTests.java index 87639c6aa0..4fcdc3ec1b 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorAnnotationTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorAnnotationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,9 +40,9 @@ import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandlingException; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessagingException; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.support.GenericMessage; import org.springframework.integration.support.MessageBuilder; @@ -114,7 +114,7 @@ public class MethodInvokingMessageProcessorAnnotationTests { .setHeader("num", new Integer(123)).build(); MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(testService, method); Object result = processor.processMessage(message); - assertEquals(new Integer(123), result); + assertEquals(123, result); } @Test(expected = MessageHandlingException.class) @@ -211,8 +211,8 @@ public class MethodInvokingMessageProcessorAnnotationTests { .setHeader("attrib1", new Integer(123)) .setHeader("attrib2", new Integer(456)).build(); Map result = (Map) processor.processMessage(message); - assertEquals(new Integer(123), result.get("attrib1")); - assertEquals(new Integer(456), result.get("attrib2")); + assertEquals(123, result.get("attrib1")); + assertEquals(456, result.get("attrib2")); } @Test @@ -220,8 +220,8 @@ public class MethodInvokingMessageProcessorAnnotationTests { Method method = TestService.class.getMethod("mapPayload", Map.class); MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(testService, method); Map payload = new HashMap(); - payload.put("attrib1", new Integer(88)); - payload.put("attrib2", new Integer(99)); + payload.put("attrib1", 88); + payload.put("attrib2", 99); Message> message = MessageBuilder.withPayload(payload) .setHeader("attrib1", new Integer(123)) .setHeader("attrib2", new Integer(456)).build(); @@ -447,8 +447,7 @@ public class MethodInvokingMessageProcessorAnnotationTests { MessageBuilder builder = MessageBuilder.withPayload(employee); builder.setHeader("day", "monday"); builder.setHeader("month", "September"); - Message message = builder.build(); - return message; + return builder.build(); } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java index 246dd20c8a..c72a672e21 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java @@ -15,6 +15,7 @@ */ package org.springframework.integration.handler; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -39,7 +40,7 @@ import org.junit.rules.ExpectedException; import org.springframework.beans.factory.BeanFactory; import org.springframework.expression.spel.SpelEvaluationException; -import org.springframework.integration.annotation.Header; +import org.springframework.messaging.handler.annotation.Header; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.gateway.GatewayProxyFactoryBean; import org.springframework.integration.gateway.RequestReplyExchanger; @@ -58,7 +59,7 @@ import org.springframework.messaging.support.GenericMessage; * @author Gary Russell * @author Gunnar Hillert */ -@SuppressWarnings({ "rawtypes", "unchecked" }) +@SuppressWarnings({"rawtypes", "unchecked"}) public class MethodInvokingMessageProcessorTests { private static final Log logger = LogFactory.getLog(MethodInvokingMessageProcessorTests.class); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/message/PayloadAndHeaderMappingTests.java b/spring-integration-core/src/test/java/org/springframework/integration/message/PayloadAndHeaderMappingTests.java index 792ecb43c9..501e547117 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/message/PayloadAndHeaderMappingTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/message/PayloadAndHeaderMappingTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,9 +31,9 @@ import org.junit.Before; import org.junit.Test; import org.springframework.messaging.Message; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.MessageHandler; import org.springframework.integration.handler.ServiceActivatingHandler; import org.springframework.integration.support.MessageBuilder; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/router/MethodInvokingRouterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/router/MethodInvokingRouterTests.java index 9a1e6fe995..71311b1f80 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/router/MethodInvokingRouterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/router/MethodInvokingRouterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,16 +26,17 @@ import java.util.ArrayList; import java.util.List; import org.junit.Test; -import org.springframework.integration.annotation.Header; + import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.channel.TestChannelResolver; -import org.springframework.messaging.support.GenericMessage; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageDeliveryException; import org.springframework.messaging.MessagingException; import org.springframework.messaging.core.DestinationResolver; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.support.GenericMessage; /** * @author Mark Fisher @@ -137,13 +138,13 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } - } @Test @@ -163,7 +164,8 @@ public class MethodInvokingRouterTests { this.doTestChannelInstanceResolutionByPayload(router, channelResolver); } - private void doTestChannelInstanceResolutionByPayload(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestChannelInstanceResolutionByPayload(MethodInvokingRouter router, + TestChannelResolver channelResolver) { Message fooMessage = new GenericMessage("foo"); Message barMessage = new GenericMessage("bar"); Message badMessage = new GenericMessage("bad"); @@ -182,9 +184,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } @@ -207,7 +210,8 @@ public class MethodInvokingRouterTests { this.doTestChannelInstanceResolutionByMessage(router, channelResolver); } - private void doTestChannelInstanceResolutionByMessage(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestChannelInstanceResolutionByMessage(MethodInvokingRouter router, + TestChannelResolver channelResolver) { QueueChannel fooChannel = new QueueChannel(); QueueChannel barChannel = new QueueChannel(); channelResolver.addChannel("foo-channel", fooChannel); @@ -226,9 +230,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } @@ -251,7 +256,8 @@ public class MethodInvokingRouterTests { this.doTestMultiChannelNameResolutionByPayload(router, channelResolver); } - private void doTestMultiChannelNameResolutionByPayload(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestMultiChannelNameResolutionByPayload(MethodInvokingRouter router, + TestChannelResolver channelResolver) { QueueChannel fooChannel = new QueueChannel(); QueueChannel barChannel = new QueueChannel(); channelResolver.addChannel("foo-channel", fooChannel); @@ -276,9 +282,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2b.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } } @@ -300,7 +307,8 @@ public class MethodInvokingRouterTests { this.doTestMultiChannelNameResolutionByMessage(router, channelResolver); } - private void doTestMultiChannelNameResolutionByMessage(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestMultiChannelNameResolutionByMessage(MethodInvokingRouter router, + TestChannelResolver channelResolver) { QueueChannel fooChannel = new QueueChannel(); QueueChannel barChannel = new QueueChannel(); channelResolver.addChannel("foo-channel", fooChannel); @@ -325,9 +333,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2b.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } } @@ -349,7 +358,8 @@ public class MethodInvokingRouterTests { this.doTestMultiChannelNameArrayResolutionByMessage(router, channelResolver); } - private void doTestMultiChannelNameArrayResolutionByMessage(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestMultiChannelNameArrayResolutionByMessage(MethodInvokingRouter router, + TestChannelResolver channelResolver) { QueueChannel fooChannel = new QueueChannel(); QueueChannel barChannel = new QueueChannel(); channelResolver.addChannel("foo-channel", fooChannel); @@ -374,9 +384,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2b.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } } @@ -398,7 +409,8 @@ public class MethodInvokingRouterTests { this.doTestMultiChannelListResolutionByPayload(router, channelResolver); } - private void doTestMultiChannelListResolutionByPayload(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestMultiChannelListResolutionByPayload(MethodInvokingRouter router, + TestChannelResolver channelResolver) { QueueChannel fooChannel = new QueueChannel(); QueueChannel barChannel = new QueueChannel(); channelResolver.addChannel("foo-channel", fooChannel); @@ -423,9 +435,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2b.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } @@ -448,7 +461,8 @@ public class MethodInvokingRouterTests { this.doTestMultiChannelListResolutionByMessage(router, channelResolver); } - private void doTestMultiChannelListResolutionByMessage(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestMultiChannelListResolutionByMessage(MethodInvokingRouter router, + TestChannelResolver channelResolver) { QueueChannel fooChannel = new QueueChannel(); QueueChannel barChannel = new QueueChannel(); channelResolver.addChannel("foo-channel", fooChannel); @@ -473,9 +487,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2b.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } @@ -498,7 +513,8 @@ public class MethodInvokingRouterTests { this.doTestMultiChannelArrayResolutionByMessage(router, channelResolver); } - private void doTestMultiChannelArrayResolutionByMessage(MethodInvokingRouter router, TestChannelResolver channelResolver) { + private void doTestMultiChannelArrayResolutionByMessage(MethodInvokingRouter router, + TestChannelResolver channelResolver) { QueueChannel fooChannel = new QueueChannel(); QueueChannel barChannel = new QueueChannel(); channelResolver.addChannel("foo-channel", fooChannel); @@ -523,9 +539,10 @@ public class MethodInvokingRouterTests { assertEquals("bar", result2b.getPayload()); try { - router.handleMessage(badMessage); - fail(); - } catch (MessageDeliveryException e) { + router.handleMessage(badMessage); + fail(); + } + catch (MessageDeliveryException e) { /* Success */ } @@ -551,6 +568,7 @@ public class MethodInvokingRouterTests { } return null; } + } @@ -583,6 +601,7 @@ public class MethodInvokingRouterTests { } return results; } + } @@ -607,6 +626,7 @@ public class MethodInvokingRouterTests { } return null; } + } @@ -645,6 +665,7 @@ public class MethodInvokingRouterTests { } return results; } + } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java index 3ccf681fd6..4333b18142 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/splitter/MethodInvokingSplitterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,17 +22,18 @@ import static org.junit.Assert.assertNotNull; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.junit.Test; -import org.springframework.messaging.Message; import org.springframework.integration.IntegrationMessageHeaderAccessor; -import org.springframework.integration.annotation.Header; import org.springframework.integration.annotation.Splitter; import org.springframework.integration.channel.QueueChannel; -import org.springframework.messaging.support.GenericMessage; import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.Message; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.support.GenericMessage; /** * @author Mark Fisher @@ -305,7 +306,6 @@ public class MethodInvokingSplitterTests { return list; } } - ; GenericMessage> message = new GenericMessage>(Arrays.asList("foo", "bar")); MethodInvokingSplitter splitter = new MethodInvokingSplitter(new ListSplitter(), "split"); QueueChannel replyChannel = new QueueChannel(); @@ -511,14 +511,11 @@ public class MethodInvokingSplitterTests { public List splitPayloadAndHeader(String payload, @Header("testHeader") String header) { String regex = "\\."; List results = new ArrayList(); - for (String s : payload.split(regex)) { - results.add(s); - } - for (String s : header.split(regex)) { - results.add(s); - } + Collections.addAll(results, payload.split(regex)); + Collections.addAll(results, header.split(regex)); return results; } + } public static class SingleAnnotationTestBean { @@ -531,6 +528,7 @@ public class MethodInvokingSplitterTests { public String[] anotherMethod(String input) { throw new UnsupportedOperationException("incorrect test invocation"); } + } public static class AmbiguousTypeMatchTestBean { @@ -544,6 +542,7 @@ public class MethodInvokingSplitterTests { public String[] method2(String input) { throw new UnsupportedOperationException("incorrect test invocation"); } + } public static class SinglePublicMethodTestBean { @@ -555,6 +554,7 @@ public class MethodInvokingSplitterTests { String[] anotherMethod(String input) { throw new UnsupportedOperationException("incorrect test invocation"); } + } public static class MultiplePublicMethodTestBean { @@ -566,6 +566,7 @@ public class MethodInvokingSplitterTests { public String[] method2(String input) { throw new UnsupportedOperationException("incorrect test invocation"); } + } @@ -575,5 +576,6 @@ public class MethodInvokingSplitterTests { private TestStringMessage(String payload) { super(payload); } + } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/transformer/MessageHistoryParameterTests.java b/spring-integration-core/src/test/java/org/springframework/integration/transformer/MessageHistoryParameterTests.java index b8c2f7e04f..1d30d327ed 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/transformer/MessageHistoryParameterTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/transformer/MessageHistoryParameterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHeaders; -import org.springframework.integration.annotation.Header; -import org.springframework.integration.annotation.Headers; -import org.springframework.integration.annotation.Payload; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.integration.annotation.Transformer; import org.springframework.messaging.PollableChannel; import org.springframework.integration.history.MessageHistory; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/transformer/MethodInvokingTransformerTests.java b/spring-integration-core/src/test/java/org/springframework/integration/transformer/MethodInvokingTransformerTests.java index 31519d4408..aa56a4dfa5 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/transformer/MethodInvokingTransformerTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/transformer/MethodInvokingTransformerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,13 +24,13 @@ import java.util.Properties; import org.junit.Test; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHandlingException; -import org.springframework.integration.annotation.Header; import org.springframework.integration.annotation.Transformer; import org.springframework.integration.handler.MethodInvokingMessageProcessor; -import org.springframework.messaging.support.GenericMessage; import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHandlingException; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.support.GenericMessage; /** * @author Mark Fisher @@ -212,7 +212,7 @@ public class MethodInvokingTransformerTests { assertNull(result); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"rawtypes", "unchecked"}) @Test // this changed in 2.0 see INT-785 and INT-1130 public void headerEnricherConfiguredWithMethodReference() throws Exception { TestBean testBean = new TestBean(); @@ -231,7 +231,7 @@ public class MethodInvokingTransformerTests { assertEquals("baz", result.getHeaders().get("prop3")); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"rawtypes", "unchecked"}) @Test // this changed in 2.0 see INT-785 and INT-1130 public void headerEnricherConfiguredWithMethodName() throws Exception { TestBean testBean = new TestBean(); @@ -264,7 +264,7 @@ public class MethodInvokingTransformerTests { } @Transformer - public String optionalHeaderTest(String s, @Header(value="number", required=false) Integer num) { + public String optionalHeaderTest(String s, @Header(value = "number", required = false) Integer num) { return s + num; } @@ -290,6 +290,7 @@ public class MethodInvokingTransformerTests { public Object nullReturnValueTest(Message message) { return null; } + } } diff --git a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests-context.xml b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests-context.xml index abf2ac8641..7184d17310 100644 --- a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests-context.xml +++ b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests-context.xml @@ -25,6 +25,7 @@ + diff --git a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests.java b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests.java index d374222134..0b7d48cb4d 100644 --- a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests.java +++ b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/JpaOutboundGatewayTests.java @@ -115,11 +115,13 @@ public class JpaOutboundGatewayTests { @Test public void getAllStudents() { - - final List students = studentService.getAllStudents(); + List students = studentService.getAllStudentsDeprecated(); Assert.assertNotNull(students); Assert.assertTrue(students.size() == 3); + students = studentService.getAllStudents(); + Assert.assertNotNull(students); + Assert.assertTrue(students.size() == 3); } @Test diff --git a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/StudentService.java b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/StudentService.java index d5e3843ab0..44f7245752 100644 --- a/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/StudentService.java +++ b/spring-integration-jpa/src/test/java/org/springframework/integration/jpa/outbound/StudentService.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -10,13 +10,19 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ + package org.springframework.integration.jpa.outbound; import java.util.List; -import org.springframework.integration.annotation.Payload; import org.springframework.integration.jpa.test.entity.StudentDomain; +import org.springframework.messaging.handler.annotation.Payload; +/** + * @author Amol Nayak + * @author Artem Bilan + * @since 2.2 + */ public interface StudentService { StudentDomain getStudent(StudentDomain student); @@ -26,6 +32,10 @@ public interface StudentService { StudentDomain getStudent(Long id); StudentDomain deleteStudent(StudentDomain student); + @SuppressWarnings("deprecation") + @org.springframework.integration.annotation.Payload("new java.util.Date()") + List getAllStudentsDeprecated(); + @Payload("new java.util.Date()") List getAllStudents(); diff --git a/spring-integration-test/src/test/java/org/springframework/integration/test/mockito/ServiceActivatorOnMockitoMockTests.java b/spring-integration-test/src/test/java/org/springframework/integration/test/mockito/ServiceActivatorOnMockitoMockTests.java index ebcc076469..0786cc1b37 100644 --- a/spring-integration-test/src/test/java/org/springframework/integration/test/mockito/ServiceActivatorOnMockitoMockTests.java +++ b/spring-integration-test/src/test/java/org/springframework/integration/test/mockito/ServiceActivatorOnMockitoMockTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,13 +20,13 @@ import static org.mockito.Mockito.verify; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.messaging.MessageChannel; -import org.springframework.integration.annotation.Header; import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.messaging.PollableChannel; import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.PollableChannel; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -47,10 +47,12 @@ public class ServiceActivatorOnMockitoMockTests { PollableChannel out; public static class SingleAnnotatedMethodOnClass { + @ServiceActivator public String move(String s) { return s; } + } @Autowired @@ -77,10 +79,13 @@ public class ServiceActivatorOnMockitoMockTests { verify(singleMethodOnClass).move("SingleMethodOnClass"); } + @SuppressWarnings("deprecation") public static class SingleMethodAcceptingHeaderOnClass { - public String move(@Header("s") String s) { + + public String move(@org.springframework.integration.annotation.Header("s") String s) { return s; } + } @Autowired @@ -88,7 +93,9 @@ public class ServiceActivatorOnMockitoMockTests { @Test public void shouldInvokeMockedSingleMethodAcceptingHeaderOnClass() { - in.send(MessageBuilder.withPayload("SingleMethodAcceptingHeaderOnClass").setHeader("s", "SingleMethodAcceptingHeaderOnClass").build()); + in.send(MessageBuilder.withPayload("SingleMethodAcceptingHeaderOnClass") + .setHeader("s", "SingleMethodAcceptingHeaderOnClass") + .build()); verify(singleMethodAcceptingHeaderOnClass).move("SingleMethodAcceptingHeaderOnClass"); }