HTTP请求标头在Spring Integration中设置为LinkedList

时间:2014-10-12 13:54:38

标签: java spring http httprequest spring-integration

我们正在尝试将请求参数从HTTP入站请求设置为标头。我们设法成功地将请求值设置为标头,但是没有按照我们想要的方式设置。

请求标头映射值设置为消息头,作为java.util.LinkedList而不是String,这是预期的请求参数类型。

以下是配置

<int-http:inbound-gateway id="inboundApplicationDataRequestGateway"
        supported-methods="GET"
        request-channel="applicationDataRequest"
        reply-channel="applicationDataResponse"
        mapped-response-headers="HTTP_REQUEST_HEADERS"
        path="/services/application/that/data"
        reply-timeout="50000">

            <int-http:header name="dataVersion" expression="#requestParams['data_version']"/>
        </int-http:inbound-gateway>

<int:service-activator id="applicationDataServiceActivator"
                    input-channel="applicationDataRequest"
                    output-channel="applicationDataResponse"
                    ref="dataService"
                    method="getData"
                    requires-reply="false"
                    send-timeout="60000"/>  

以下是样本服务方法

public void getData(Message<?> inMessage){
        MessageHeaders headers = inMessage.getHeaders();
        logger.info("DATA VERSION : " + (String)headers.get("dataVersion"));
    }

以下是stacktrace

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.messaging.MessageHandlingException: java.lang.ClassCastException: java.util.LinkedList cannot be cast to java.lang.String
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)

我们如何将dataVersion设置为字符串而不是链接列表?

此外,我们还需要在其他http入站网关方法中对​​POST请求执行以下操作

感谢任何帮助。

此致 MilindaD

1 个答案:

答案 0 :(得分:0)

那是因为servletRequest.getParameterMap()返回Map<String, String[]>而Spring Integration将其转换为MultiValueMap<String, String>。当你问get某个值时,它真的会返回LinkedList<String>

所以,要从List获得单个值(这里你确实只有一个项目),你应该使用它:

<int-http:header name="dataVersion" expression="#requestParams.getFirst('data_version')"/>