From b06978038134d4afef26b79565d3a5a0074daa00 Mon Sep 17 00:00:00 2001 From: Chengchen JI Date: Tue, 30 Apr 2019 00:25:00 +0200 Subject: [PATCH] GH-2908: Publisher: synthesize anns for @AliasFor Fixes https://github.com/spring-projects/spring-integration/issues/2908 * make sure the attribute is taken into account in @Header annotation * remove useless spaces according to checkstyle rules * make sure the expression attribute is taken into account as well in @Payload annotation --- ...thodAnnotationPublisherMetadataSource.java | 9 +++++--- ...nnotationPublisherMetadataSourceTests.java | 23 ++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) 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 59cee395d4..0d4c2d39b7 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 @@ -44,6 +44,7 @@ import org.springframework.util.StringUtils; * @author Artem Bilan * @author Gareth Chapman * @author Cameron Mayfield + * @author Chengchen Ji * * @since 2.0 */ @@ -114,7 +115,7 @@ public class MethodAnnotationPublisherMetadataSource implements PublisherMetadat "@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)), + Assert.state("".equals(AnnotationUtils.getValue(AnnotationUtils.synthesizeAnnotation(currentAnnotation, null))), "@Payload on a parameter for a @Publisher method may not contain an expression"); payloadExpression = @@ -204,8 +205,10 @@ public class MethodAnnotationPublisherMetadataSource implements PublisherMetadat @SuppressWarnings("unchecked") private T getAnnotationValue(Annotation annotation, String attributeName, Class expectedType) { T value = null; - Object valueAsObject = (attributeName == null) ? AnnotationUtils.getValue(annotation) - : AnnotationUtils.getValue(annotation, attributeName); + Object valueAsObject = (attributeName == null) ? + AnnotationUtils.getValue(AnnotationUtils.synthesizeAnnotation(annotation, null)) : + AnnotationUtils.getValue(annotation, attributeName); + if (valueAsObject != null) { if (expectedType.isAssignableFrom(valueAsObject.getClass())) { value = (T) valueAsObject; 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 003d1a1dbe..f9f04d6868 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 @@ -37,6 +37,7 @@ import org.springframework.test.util.ReflectionTestUtils; * @author Mark Fisher * @author Artem Bilan * @author Cameron Mayfield + * @author Chengchen Ji * * @since 2.0 */ @@ -116,6 +117,18 @@ public class MethodAnnotationPublisherMetadataSourceTests { assertThat(payloadExpression).isEqualTo("#args[0]"); } + @Test(expected = IllegalStateException.class) + public void voidReturnAndParameterPayloadAnnotationWithExpression() { + Method method = getMethod("methodWithVoidReturnAndParameterPayloadAnnotationWithExpression", String.class); + source.getExpressionForPayload(method).getExpressionString(); + } + + @Test(expected = IllegalStateException.class) + public void voidReturnAndParameterPayloadAnnotationWithValue() { + Method method = getMethod("methodWithVoidReturnAndParameterPayloadAnnotationWithValue", String.class); + source.getExpressionForPayload(method).getExpressionString(); + } + @Test(expected = IllegalArgumentException.class) public void voidReturnAndNoPayloadAnnotation() { Method method = getMethod("methodWithVoidReturnAndNoPayloadAnnotation", String.class); @@ -182,13 +195,21 @@ public class MethodAnnotationPublisherMetadataSourceTests { @Publisher @Payload("testExpression2") - public void methodWithHeaderAnnotations(String arg1, @Header("foo") String h1, @Header("bar") String h2) { + public void methodWithHeaderAnnotations(String arg1, @Header("foo") String h1, @Header(name = "bar") String h2) { } @Publisher public void methodWithVoidReturnAndParameterPayloadAnnotation(@Payload String payload) { } + @Publisher + public void methodWithVoidReturnAndParameterPayloadAnnotationWithExpression(@Payload(expression = "foo") String payload) { + } + + @Publisher + public void methodWithVoidReturnAndParameterPayloadAnnotationWithValue(@Payload("foo") String payload) { + } + @Publisher public void methodWithVoidReturnAndNoPayloadAnnotation(String payload) { }