Http网关和Json转换器:剥离报头



使用Spring Integration 4.0.3。发布与Jackson2,我正在尝试使用Json转换器与http网关。

我的路径看起来类似于Spring Integration文档中引用的amqp适配器,但使用http网关(1):

…-> object-to-json-transformer -> http-outbound-gateway——>

——> http-inbound-gateway -> json-to-object-transformer ->

客户:

<int:chain id="messageTransformerChain" input-channel="toServer" output-channel="messagesToServer">
...
<int:object-to-json-transformer />
</int:chain>
<int-http:outbound-gateway id="httpOutToSever"
request-channel="messagesToServer"
reply-channel="replyFromServer"
url="${server.endpoint}"
http-method="POST"
extract-request-payload="true"
expected-response-type="java.lang.String" />

服务器:

<int-http:inbound-gateway id="httpInboundFromClientGateway"
supported-methods="GET, POST"
request-channel="fromClientChannel" />
<int:chain input-channel="fromClientChannel">
<int:json-to-object-transformer />
...
</int:chain>

我得到的例外是(我认为相关的是粗体):

2014-08-22T23:58:21.640-0400 WARN [http-bio-8080-exec-2]http prequesthandlingmessaginggateway失败发生在网关sendAndReceiveorg.springframework.integration.transformer.MessageTransformationException:未能转换消息org.springframework.integration.transformer.AbstractTransformer.transform (AbstractTransformer.java: 44)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage (MessageTransformingHandler.java: 68)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal (AbstractReplyProducingMessageHandler.java: 170)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.handler.AbstractMessageHandler.handleMessage (AbstractMessageHandler.java: 78)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.handler.MessageHandlerChain.handleMessageInternal (MessageHandlerChain.java: 131)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.handler.AbstractMessageHandler.handleMessage (AbstractMessageHandler.java: 78)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch (AbstractDispatcher.java: 116)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch (UnicastingDispatcher.java: 101)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch (UnicastingDispatcher.java: 97)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.channel.AbstractSubscribableChannel.doSend (AbstractSubscribableChannel.java: 77)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.channel.AbstractMessageChannel.send (AbstractMessageChannel.java: 255)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.messaging.core.GenericMessagingTemplate.doSend (GenericMessagingTemplate.java: 109)~ (spring-messaging-4.0.6.RELEASE.jar: 4.0.6。发布)org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive (GenericMessagingTemplate.java: 144)~ (spring-messaging-4.0.6.RELEASE.jar: 4.0.6。发布)org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive (GenericMessagingTemplate.java: 44)~ (spring-messaging-4.0.6.RELEASE.jar: 4.0.6。发布)org.springframework.messaging.core.AbstractMessagingTemplate.sendAndReceive (AbstractMessagingTemplate.java: 75)~ (spring-messaging-4.0.6.RELEASE.jar: 4.0.6。发布)org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive (MessagingGatewaySupport.java: 250)[spring-integration-core-4.0.3.RELEASE.jar: na]org.springframework.integration.gateway.MessagingGatewaySupport.sendAndReceiveMessage (MessagingGatewaySupport.java: 224)[spring-integration-core-4.0.3.RELEASE.jar: na]org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.actualDoHandleRequest (HttpRequestHandlingEndpointSupport.java: 473)[spring-integration-http-4.0.3.RELEASE.jar: na]org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.doHandleRequest (HttpRequestHandlingEndpointSupport.java: 370)[spring-integration-http-4.0.3.RELEASE.jar: na]org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway.handleRequest (HttpRequestHandlingMessagingGateway.java: 101)[spring-integration-http-4.0.3.RELEASE.jar: na]org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle (HttpRequestHandlerAdapter.java: 51)【spring-webmvc-4.0.6.RELEASE.jar: 4.0.6。发布)org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java: 938)[spring-webmvc-4.0.6.RELEASE.jar: 4.0.6。[释放]原因:java.lang.IllegalArgumentException:无法解析'json__TypeId__'在"将javatype"。在org.springframework.integration.support.json.AbstractJacksonJsonObjectMapper.createJavaType (AbstractJacksonJsonObjectMapper.java: 67)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.support.json.Jackson2JsonObjectMapper.extractJavaType (Jackson2JsonObjectMapper.java: 119)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.support.json.Jackson2JsonObjectMapper.extractJavaType (Jackson2JsonObjectMapper.java: 44)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.support.json.AbstractJacksonJsonObjectMapper.fromJson (AbstractJacksonJsonObjectMapper.java: 60)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.json.JsonToObjectTransformer.doTransform (JsonToObjectTransformer.java: 81)~ (spring-integration-core-4.0.3.RELEASE.jar: na)org.springframework.integration.transformer.AbstractTransformer.transform (AbstractTransformer.java: 33)~ (spring-integration-core-4.0.3.RELEASE.jar na):……102通用帧省略了

调试时,我在客户端看到json__TypeId__标头已从传出消息中剥离。当我将JsonHeaders.HEADERS添加到DefaultHttpHeaderMapper并使用此映射器注入网关时,我看到当映射器工作完成时,Json标头存在,但是当我最终回到RestTemplate.doWithRequest时,requestHeaders不再包含Json标头。当然,我在服务器端得到了相同的异常

也许我的配置是不正确的,但与头部被剥夺,我不确定服务器端如何能够做json-to-object转换。

我不希望在通道的特定映射器上显式地指示类型,因为它们可能会变化。是否有一种方法可以配置支持此路径所需的组件?

——参考文献——

(1) http://docs.spring.io/spring-integration/reference/html/messaging-transformation-chapter.html#transformer滚动到Json transformer子节

使用出站http适配器,用户头(在这里是json类型信息)通过http作为X-<header>传送…

<int-http:outbound-gateway request-channel="requestChannel" 
url="http://localhost:18080/http/receiveGateway"
http-method="POST"
mapped-request-headers="foo"
expected-response-type="java.lang.String"/>
POST /http/receiveGateway HTTP/1.1
Accept: text/plain, */*
X-foo: bar

在服务器端,X-没有被删除,所以你必须将它与x…

<int-http:inbound-gateway request-channel="receiveChannel"
path="/receiveGateway"
mapped-request-headers="x-foo"
supported-methods="POST"/>

然后,在转换器之前,您将需要在<chain/>中设置<header-enricher/>来设置标题(减去'x-')…

<int:header-enricher>
<int:header name="json__TypeId__" expression="headers['x-json__TypeId__']" />
...
</int:header-enricher>

(注小写x)。

编辑:

或者,在发送端,您可以将映射器配置为不添加自定义报头的前缀…

<bean id="mapper" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper">
<property name="outboundHeaderNames" value="foo,bar" />
<property name="userDefinedHeaderPrefix" value="" />
</bean>

最新更新