1

我有一个 http-inbound-gateway,我想检索一个请求参数来填充入站通道作为有效负载。我发现http-inbound-gateway 支持spring 表达式,所以我可以使用#requestParams 来检索请求参数。似乎 #requestParams 等效于返回 Map 的 request.getParameters('key') 但我希望调用返回 String 的 request.getParameter('key') 。目前我必须使用 new String(#requestParams['key']) 来解决这个问题。有没有更好的方法来做到这一点?

<int-http:inbound-gateway path="/mypath"
    supported-methods="GET" payload-expression="new String(#requestParams['key']?:'')"
    request-channel="inboundChannel" reply-channel="outboundChannel"
    error-channel="errorChannel"
    message-converters="stringHttpMessageConverterUsingUtf8">       
</int-http:inbound-gateway>
4

2 回答 2

1

我在 org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport 中找到源代码

@SuppressWarnings({ "rawtypes", "unchecked" })
private Message<?> actualDoHandleRequest(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException {
//omitted codes
LinkedMultiValueMap<String, String> requestParams = this.convertParameterMap(servletRequest.getParameterMap());
        evaluationContext.setVariable("requestParams", requestParams);
//omitted codes    
}

所以#requestParameters 是一个LinkedMultiValueMap 对象。我可以用

#requestParams.get('your key')?:''//null safe 

获取所需的字符串请求参数。

于 2013-07-03T05:25:09.047 回答
1

requestParams变量是LinkedMultiValueMap类型的对象。LinkedMultiValueMap#get方法返回列表。所以你的代码#requestParams.get('your key')?:''//null safe返回字符串列表。它在大多数情况下都可以正常工作,但例如比较(#requestParams.get('your key')?:'').equals('value')会失败。获取第一个字符串参数的完整 null 安全代码是:

(#requestParams.get('your key')?:{''})[0]

请注意,LinkedMultiValueMap将多个值存储在LinkedList. 如果只需要一个请求参数值,可以考虑使用LinkedMultiValueMap#toSingleValueMap方法。

于 2015-07-13T23:30:56.563 回答