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 a9175f2420..48c840be07 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 @@ -292,9 +292,14 @@ public abstract class AbstractMethodAnnotationPostProcessor annotations) { AbstractEndpoint endpoint; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/channel/BeanFactoryChannelResolver.java b/spring-integration-core/src/main/java/org/springframework/integration/support/channel/BeanFactoryChannelResolver.java index 0afe61c6c3..c2e3aa39df 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/channel/BeanFactoryChannelResolver.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/channel/BeanFactoryChannelResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2017 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,6 +22,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.core.DestinationResolutionException; @@ -88,6 +89,10 @@ public class BeanFactoryChannelResolver implements DestinationResolver invocation.getArgument(0)) + .given(beanFactory).initializeBean(any(DirectChannel.class), eq("channel")); + willAnswer(invocation -> invocation.getArgument(0)) + .given(beanFactory).initializeBean(any(MessageHandler.class), eq("foo.foo.serviceActivator.handler")); + MessagingAnnotationPostProcessor mapp = new MessagingAnnotationPostProcessor(); + mapp.setBeanFactory(beanFactory); + mapp.afterPropertiesSet(); + mapp.postProcessAfterInitialization(new Foo(), "foo"); + verify(beanFactory).registerSingleton(eq("channel"), any(DirectChannel.class)); + } + + @Test + public void testDontCreateChannelWhenChannelHasBadDefinition() { + ConfigurableListableBeanFactory beanFactory = mock(ConfigurableListableBeanFactory.class); + given(beanFactory.getBean("channel", MessageChannel.class)).willThrow(BeanCreationException.class); + willAnswer(invocation -> invocation.getArgument(0)) + .given(beanFactory).initializeBean(any(DirectChannel.class), eq("channel")); + willAnswer(invocation -> invocation.getArgument(0)) + .given(beanFactory).initializeBean(any(MessageHandler.class), eq("foo.foo.serviceActivator.handler")); + MessagingAnnotationPostProcessor mapp = new MessagingAnnotationPostProcessor(); + mapp.setBeanFactory(beanFactory); + mapp.afterPropertiesSet(); + try { + mapp.postProcessAfterInitialization(new Foo(), "foo"); + fail("Expected a DestinationResolutionException"); + } + catch (DestinationResolutionException e) { + assertThat(e.getMessage(), + containsString("A bean definition with name 'channel' exists, but failed to be created")); + } + } + + public static class Foo { + + @ServiceActivator(inputChannel = "channel") + public void foo(String in) { + // empty + } + + } + +}