在Spring Integration 4.2

时间:2015-11-25 18:33:13

标签: java json spring spring-mvc spring-integration

在Spring Integration 4.2.1.RELEASE中创建HTTP代理。 Environment正在使用最新的2.0.0.RELEASE平台BOM,包括在Tomcat7上运行的spring-webmvc层。

调用是“application / json”,通过Web层传递到不同的REST服务器端点(setupUrl方法重写URL)。代码成功调用外部服务器,得到良好的响应,然后在响应返回调用者之前将响应破坏。

@Bean
    public IntegrationFlow httpProxyFlow()  {
        return IntegrationFlows
            .from((MessagingGateways g) ->
                    g.httpGateway("/my-service/**")
                            .messageConverters(new MappingJackson2HttpMessageConverter())
                        .payloadFunction(httpEntity ->
                                ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                                        .getRequest()
                                        .getQueryString())
                        .requestPayloadType(String.class))
                        .handleWithAdapter(a ->
                                a.httpGateway(this::setupUrl)
                                        .httpMethodFunction(this::getMethodFunction)
                                        .errorHandler(new PassThroughErrorHandler())
                                        .encodeUri(false)
                                        .expectedResponseType(String.class)
                        ).get();
    }

直接调用REST端点返回

  

{ “联盟”: “测试”, “生产者”: “TST”, “产品” ...

通过Spring Integration调用返回

  

“{\” 联盟\ “:\” 测试\ “\ ”制片\“:\ ”TST \“,\ ”产品\“:[{\”

尝试了很多将StringHttpMessageConverter添加到出站适配器的组合。弄乱编码(UTF-8而不是ISO-8859-1)。有些事情正在弄乱响应字符串,而且它似乎是在它离开Spring Integration之后就像我所知道的那样。 Integration最后一次触摸它是HttpRequestHandlingMessagingGateway.handleRequest()第117行。它在那里的响应对象中看起来仍然正确。

问题可能是spring-mvc,这是我在调试中看到错误字符串的第一个地方。

1 个答案:

答案 0 :(得分:1)

最佳猜测是if (imageCell != nil) { // Image Cell println("image cell exist") return imageCell! } else{ // Video Cell println("video cell exist") return videoCell! } (入站)或accept(出站)存在问题。

我刚刚更改了http示例......

content-type

返回到第一个网关的有效负载是类型<int-http:inbound-gateway request-channel="proxyChannel" reply-channel="reply" path="/receiveGateway" supported-methods="POST"/> <int:channel id="reply" /> <int-http:outbound-gateway request-channel="proxyChannel" reply-channel="reply" expected-response-type="java.lang.String" url="http://localhost:8080/http/receiveGateway2"/> <int-http:inbound-gateway request-channel="receiveChannel" path="/receiveGateway2" supported-methods="POST"/> <int:channel id="receiveChannel"/> <int:chain input-channel="receiveChannel"> <int:header-filter header-names="content-type" /> <int:service-activator expression='{"foo" : "bar"}'/> </int:chain> ;它适用于String accepttext/plain的入站{。}}。

由于application/json位于列表中的JSON消息转换器之前,并且有效负载是StringHttpMessageConverter,因此选择它是因为类型为String且转换器可以处理{ {1}} String,因此没有双JSON编码。

我的客户收到

*/*

如果您无法通过DEBUG日志记录和/或调试程序解决问题,则可以尝试仅使用accept重新配置入站网关。

{"foo":"bar"}的第151行(当前版本)设置断点,以查看正在选择哪个出站邮件转换器。