【问题标题】:Spring Integration gateway error channel - no such bean exceptionSpring Integration 网关错误通道 - 没有这样的 bean 异常
【发布时间】:2015-05-18 22:44:40
【问题描述】:

我已经配置了一个带有线程池支持的服务激活器的 spring 集成网关。 一切正常,直到我尝试添加自己的错误通道。 Spring 开始抱怨它无法通过错误通道的名称找到 bean。

这是我的 xml 配置:

    <int:gateway service-interface="Messaging.SendMessageToDeviceGateWay"
        error-channel="send_message_to_device_error_channel"
        default-request-channel="send_message_to_device_channel" 
        id="send_message_to_device_gateway">

        </int:gateway>

    <int:channel id="send_message_to_device_channel">
        <int:queue message-store="redisMessageStore" />
    </int:channel>

    <bean id="sendMessageToDeviceServiceBeanId" class="Messaging.SendMessageToDeviceService" />

    <int:service-activator input-channel="send_message_to_device_channel"
        ref="sendMessageToDeviceServiceBeanId" method="send_message">
        <int:poller fixed-rate="500" time-unit="MILLISECONDS"
            task-executor="send_message_to_device_task_executor" receive-timeout="0" />
    </int:service-activator>


    <bean id="sendMessageToDeviceErrorHandlerBeanId" 
        class="Messaging.SendMessageToDeviceErrorHandler" />



    <int:service-activator input-channel = "send_message_to_device_error_channel"
        ref="sendMessageToDeviceErrorHandlerBeanId" method="handle_error">
    </int:service-activator>

我看到的错误是:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'send_message_to_device_gateway': Cannot resolve reference to bean 'send_message_to_device_error_channel' while setting bean property 'errorChannel'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'send_message_to_device_error_channel' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 24 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'send_message_to_device_error_channel' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:694)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1168)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:281)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
... 37 more

为什么要找那个名字的bean?

提前致谢, 理查德。

【问题讨论】:

    标签: spring-mvc spring-integration gateway


    【解决方案1】:

    没错:任何 bean 都必须在应用程序上下文中呈现。

    即使您使用默认的 errorChannel,它也会由 Spring Integration 基础架构填充到应用程序上下文中。

    所以,无论如何你都必须提供&lt;channel id="send_message_to_device_error_channel"/&gt;

    【讨论】:

    • 嗨,我按照你说的做了,并且那个错误消失了,但是考虑到我在上面粘贴的相同配置,我的错误处理程序没有收到错误。关于可能是什么原因的任何想法?它仍然会转到默认的错误日志记录处理程序。 @Artem Bilan
    • 您的错误可能不会在网关的错误通道上收到,因为您在下游使用&lt;queue&gt; 通道。尝试在&lt;poller&gt; 上添加您的send_message_to_device_error_channel
    • 我必须说你非常精通 Spring Integration,而且你的答案很准确,我唯一的问题是,Spring Integration 文档中没有明确提到这些。他们提到错误通道只会从线程池执行程序中捕获错误,但并没有提到错误通道应该放在轮询器上,尽管这很有意义。您能否指出我可以找到一些此类配置示例的地方?再次感谢@Artem Bilan。
    • 见这里:docs.spring.io/spring-integration/docs/latest-ga/reference/html/…。但是我同意文档很弱。随时提出 JIRA(jira.spring.io/browse/INT),我们将在本章中处理此事:docs.spring.io/spring-integration/docs/latest-ga/reference/html/…。回覆。我:请阅读 SI 手册第一页上的作者列表 :-)
    • 哇!不知道我是在和作者本人交谈,再次感谢,我会尽快打开一个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2010-10-30
    相关资源
    最近更新 更多