【问题标题】:Spring Integration Header value router with condition带有条件的 Spring Integration Header 值路由器
【发布时间】:2014-12-24 08:44:37
【问题描述】:

我在回复通道上有 http 状态码的标头值路由器。如果状态代码为200,我想将原始有效负载重定向到afterSuccessChannel,否则如果标头中有任何其他状态,我想将有效负载发送到afterFailuerChannel。我不确定header-value-router 是否可行,因为没有表达式字段。 header-value-router 是否有可能,或者我必须为此使用通用路由器?

<int:header-value-router header-name="#{T(org.springframework.integration.http.HttpHeaders).STATUS_CODE}" input-channel="ccChannel" default-output-channel="ccLogger">
        <int:mapping value="200" channel="afterSuccessChannel"/>
</int:header-value-router>

即使我在消息的标题上得到http_statusCode=200,在使用上述路由器时也会出现以下错误:

ErrorMessage [payload=org.springframework.messaging.MessagingException: failed to resolve channel name 'OK'; nested exception is org.springframework.messaging.core.DestinationResolutionException: failed to look up MessageChannel with name 'OK' in the BeanFactory.; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'OK' is defined, headers={timestamp=1419419964606, id=eea83b65-0e72-bcda-d8fe-6d9bb4619fb4, history=errorChannel}]

不知道为什么要找OK频道。

【问题讨论】:

    标签: java spring spring-integration


    【解决方案1】:

    标头是HttpStatus 对象(枚举),而不是简单的字符串。

    您需要在枚举上进行映射(在本例中为 OK

    <int:mapping value="OK" channel="afterSuccessChannel"/>
    

    编辑:

    为了丢弃不匹配,您必须设置resolution-required="false"

    这些作品中的任何一个......

    <int:header-value-router input-channel="foo" default-output-channel="baz" 
        resolution-required="false"
        header-name="#{T(org.springframework.integration.http.HttpHeaders).STATUS_CODE}">
      <int:mapping value="OK" channel="bar" />
    </int:header-value-router>
    
    
    <int:router input-channel="foo" default-output-channel="baz"
        resolution-required="false"
        expression="headers['#{T(org.springframework.integration.http.HttpHeaders).STATUS_CODE}'].toString()">
      <int:mapping value="200" channel="bar" />
    </int:router>
    

    请注意,第二个是常规路由器,它使用运行时表达式来提取标头的数值。

    【讨论】:

    • 太棒了。我有一个问题。这个路由器会是有条件的吗?条件意义上的,如果值不是OK,是否会路由到default-output-channel
    • 实际上,我有一个条件路由到afterSuccessChannel 是状态值是200/OK 否则路由到ccLogger
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多