2012-11-09 64 views
0

爲了發送HTTP請求到基於郵件頭的動態網址...Spring集成 - URL變量在HTTP不工作:出站網關

我想設置從郵件標題中的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) 

缺少什麼我在這裏?

回答

0

它看起來像標題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內完成的,並且適配器無法訪問它。

+0

加里>我試着​​你的建議 - 是的使用文字表達工作得很好。我實際上是從Queue(Rabbit MQ)中讀取消息,然後在下一步中發送http請求給消息頭中的URL。所以我在Message上放置了一個標題(在Rabbit MQ中) - 所以我想知道這些標題是不是在Spring的消息中顯示的? – Jasper

+0

如果打開調試日誌記錄,則可以看到標題。 –

+1

對於來自amqp的消息,您需要向入站適配器添加'mapped-request-headers'屬性。沒有它和DEBUG日誌記錄,你會看到默認情況下自定義標題不會被映射。 –

0

我想你在{outboundGatewayUrl}之前缺少一個$符號,因此它不會被SEL擴展。這也在錯誤消息中建議。

+0

DaveRlz>添加$符號沒有幫助,我也沒有看到使用$符號的示例。但是,是的...... SEL根本沒有評估這個表達......但是爲什麼。我是否缺少任何庫或模式名稱條目 – Jasper

+0

添加美元符號是否更改消息,它仍顯示未展開的值還是現在爲空? – DaveRlz

+0

不,這些URI佔位符在運行時被動態替換,$ {}語法用於在上下文初始化時解析佔位符。 –

相關問題