【问题标题】:Spring Integration - url-variable not working in http:outbound-gatewaySpring Integration - url-variable 在 http:outbound-gateway 中不起作用
【发布时间】:2012-11-09 11:29:02
【问题描述】:

为了将http请求发送到基于消息头的动态url...

我正在尝试将消息头中的 url 值设置如下:

 <int-http:outbound-gateway id="httpOutboundGateway" request-channel="fromMyQueue" 
    url="{outboundGatewayUrl}" reply-channel="nullChannel" 
    http-method="POST" expected-response-type="java.lang.String" charset="UTF-8">
<int-http:uri-variable name="outboundGatewayUrl" expression="headers['X-CUSTOM-HTTP-REQUEST-URL']" />

但这不起作用。
显然{outboundGatewayUrl} 值根本没有被替换。
如果我将 {outboundGatewayUrl} 替换为实际 URL,则此方法有效。

错误信息:

Caused by:
org.springframework.integration.MessageHandlingException: HTTP request execution failed for URI [{outboundGatewayUrl}]...

Caused by:<br> java.lang.IllegalArgumentException: URI is not absolute
    at java.net.URI.toURL(URI.java:1080)
    at org.springframework.http.client.SimpleClientHttpRequestFactory.createRequest(SimpleClientHttpRequestFactory.java:109)

我在这里错过了什么?

【问题讨论】:

    标签: java spring spring-integration


    【解决方案1】:

    消息中似乎不存在标头 X-CUSTOM-HTTP-REQUEST-URL。

    如果表达式返回 null(即,如果标头不存在),您将收到该错误(URI 不是绝对的)。

    我刚刚进行了一个测试,它对我来说很好,有一个合适的标题;如果你认为标题是正确的,你应该分解问题;例如,首先使用文字表达式...

    <int-http:uri-variable name="outboundGatewayUrl" expression="'http://foo/bar'" />
    

    错误信息可能有点误导:

    Caused by:
    org.springframework.integration.MessageHandlingException: HTTP request execution failed    for URI [{outboundGatewayUrl}]...
    

    因为它暗示 url 没有展开。问题是扩展是在 RestTemplate 内部完成的,适配器无权访问它。

    【讨论】:

    • Gary> 我尝试了你的建议 - 是的,使用文字表达效果很好。我实际上正在从队列(Rabbit MQ)中读取消息,并在下一步中将 http 请求发送到消息头中存在的 URL。所以我确实在 Message 上放了一个标头(在 Rabbit MQ 中)-所以我想知道这些标头是否没有出现在 Spring 的 Messages 中?
    • 如果你打开调试日志,你可以看到标题。
    • 对于来自 amqp 的消息,您需要向入站适配器添加一个“mapped-request-headers”属性。如果没有它和 DEBUG 日志记录,您将看到默认情况下未映射自定义标头。
    【解决方案2】:

    我认为您在 {outboundGatewayUrl} 之前缺少一个 $ 符号,因此 SEL 没有对其进行扩展。错误消息中也建议这样做。

    【讨论】:

    • DaveRlz> 添加 $ 符号没有帮助,我也没有看到使用 $ 符号的示例。但是是的...... SEL 根本不评估表达式......但是为什么。我是否在某处缺少任何库或架构名称条目
    • 添加美元符号是否改变了消息,它仍然显示未扩展的值还是现在为空?
    • 不,这些 URI 占位符在运行时动态替换,${} 语法用于在上下文初始化时解析的占位符。
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多