diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java index a1532818be..bb65c12ce1 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AnnotationConfigParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 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. @@ -18,39 +18,34 @@ package org.springframework.integration.config.xml; import org.w3c.dom.Element; -import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; /** * Parser for the <annotation-config> element of the integration namespace. * Adds a {@link org.springframework.integration.config.annotation.MessagingAnnotationPostProcessor} + * and a {@link org.springframework.integration.aop.PublisherAnnotationBeanPostProcessor} * to the application context. * * @author Mark Fisher */ -public class AnnotationConfigParser extends AbstractSingleBeanDefinitionParser { +public class AnnotationConfigParser implements BeanDefinitionParser { - private final static String PACKAGE_NAME = IntegrationNamespaceUtils.BASE_PACKAGE + ".config.annotation"; - - - @Override - protected String getBeanClassName(Element element) { - return PACKAGE_NAME + ".MessagingAnnotationPostProcessor"; + public BeanDefinition parse(Element element, ParserContext parserContext) { + RootBeanDefinition messagingAnnotationPostProcessorDef = new RootBeanDefinition( + IntegrationNamespaceUtils.BASE_PACKAGE + ".config.annotation.MessagingAnnotationPostProcessor"); + messagingAnnotationPostProcessorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + String messagingAnnotationPostProcessorName = IntegrationNamespaceUtils.BASE_PACKAGE + ".internalMessagingAnnotationPostProcessor"; + parserContext.getRegistry().registerBeanDefinition(messagingAnnotationPostProcessorName, messagingAnnotationPostProcessorDef); + RootBeanDefinition publisherAnnotationPostProcessorDef = new RootBeanDefinition( + IntegrationNamespaceUtils.BASE_PACKAGE + ".aop.PublisherAnnotationBeanPostProcessor"); + publisherAnnotationPostProcessorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + String publisherAnnotationPostProcessorName = IntegrationNamespaceUtils.BASE_PACKAGE + ".internalPublisherAnnotationBeanPostProcessor"; + parserContext.getRegistry().registerBeanDefinition(publisherAnnotationPostProcessorName, publisherAnnotationPostProcessorDef); + return null; } - @Override - protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) - throws BeanDefinitionStoreException { - return PACKAGE_NAME + ".internalMessagingAnnotationPostProcessor"; - } - - @Override - protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - } } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests-context.xml new file mode 100644 index 0000000000..dee54a59d6 --- /dev/null +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests-context.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000000..d47c966292 --- /dev/null +++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/AnnotationConfigRegistrationTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2010 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on 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.aop; + +import junit.framework.Assert; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.core.Message; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @since 2.0 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class AnnotationConfigRegistrationTests { + + @Autowired + private TestBean testBean; + + @Autowired + private QueueChannel channel; + + + @Test // INT-1200 + public void verifyInterception() { + String name = testBean.setName("John", "Doe"); + Assert.assertNotNull(name); + Message message = channel.receive(0); + Assert.assertNotNull(message); + Assert.assertEquals("John Doe", message.getPayload()); + Assert.assertEquals("123", message.getHeaders().get("x")); + } + + + public static class TestBean { + + @Publisher(channel="testChannel", payload="#return", headers="x='123'") + public String setName(String fname, String lname){ + return fname + " " + lname; + } + } + +}