如何在 spring 集成网关中获取自定义 header 值?
How to get custom header values in spring integration gateway?
这是我的第一个问题。
我的 Web 应用程序正在使用 spring 集成来获取第 3 方 API 响应。
响应具有以 'X-' 开头的自定义 header 值。
X-Values 是两个。 (X-AccessToken-Quota-Allotted, X-AccessToken-Quota-Current)
因此,我在配置 xml 的 header-mapper 中添加了 inboundHeaderNames,如下所示。
<int-http:outbound-gateway id="dms.put.outbound.gateway.cert"
header-mapper="dmsHeaderMapper"
...
</int-http:outbound-gateway>
<bean id="dmsHeaderMapper" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper" factory-method="outboundMapper" >
<property name="outboundHeaderNames" value="X-Request-Id...blabla"/>
<property name="inboundHeaderNames" value="X-AccessToken-Quota-Allotted, X-AccessToken-Quota-Current"/>
<property name="userDefinedHeaderPrefix" value=""/>
</bean>
以下是回复。我可以在 headers 属性中看到 X-AccessToken-Quota-Allotted & X-AccessToken-Quota-Current。
[integration] GenericMessage [payload={"type":"commonResponse","serverName":"uslxacd20022use1c.intranet.local","errorMessage":null}, headers={errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@41208186, X-Request-Id=0ce88cd6-d04b-47dc-b3db-224656fe9090, uri=https://api-server.com/blabla, http_statusCode=200, X-AccessToken-Quota-Allotted=5000, jsonObjectName=DmsCommonResponseDto, Authorization=Bearer qqdtbhtp5vk2ss69wjpbdfvh, replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@41208186, json__TypeId__=class com.blabla.DmsPhoneRequestDto, requestId=0ce88cd6-d04b-47dc-b3db-224656fe9090, X-AccessToken-Quota-Current=3, id=12072f4b-8403-a328-6a77-aaba935beba2, contentType=application/json, Content-Type=application/json;charset=UTF-8, timestamp=1592791409206}]
几乎每个字段值都映射到 responseDto 的字段,但我不知道如何将 X-custom header 值映射到 responseDto 的字段。
以下是当前设置。
<int:gateway id="dmsHttpPUTGateway" service-interface="blabla.gateway.DmsHttpPUTGateway"
default-request-channel="dms.put.ch.request.header.router"><int:method name="call" /></int:gateway>
<int:header-value-router input-channel="dms.put.ch.reply.header.router" header-name="jsonObjectName">
<int:mapping value="DmsCommonResponseDto" channel="dms.put.ch.reply.transformer.DmsCommonResponseDto"/>
</int:header-value-router>
<int:channel id="dms.put.ch.reply.transformer.DmsCommonResponseDto"></int:channel>
<int:json-to-object-transformer input-channel="dms.put.ch.reply.transformer.DmsCommonResponseDto" output-channel="dms.put.ch.reply" type="blabla.DmsCommonResponseDto"></int:json-to-object-transformer>
DmsCommonResponseDto.java
private static final long serialVersionUID = 1L;
private String serverName;
private DmsErrorMessageDto errorMessage;
private Date responseDate;
...setter, getter method.
即使是一点点线索也会有所帮助。提前致谢。
听起来您需要 json 变压器下游的自定义变压器。
class MyTransformer extends AbstractTransformer {
protected abstract Object doTransform(Message<?> message) {
DmsCommonResponseDto dto = (DmsCommonResponseDto) message.getPayload();
dto.setRequestId(message.getHeaders.get("X-request-id"));
...
return dto.
}
}
这是我的第一个问题。
我的 Web 应用程序正在使用 spring 集成来获取第 3 方 API 响应。
响应具有以 'X-' 开头的自定义 header 值。 X-Values 是两个。 (X-AccessToken-Quota-Allotted, X-AccessToken-Quota-Current)
因此,我在配置 xml 的 header-mapper 中添加了 inboundHeaderNames,如下所示。
<int-http:outbound-gateway id="dms.put.outbound.gateway.cert"
header-mapper="dmsHeaderMapper"
...
</int-http:outbound-gateway>
<bean id="dmsHeaderMapper" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper" factory-method="outboundMapper" >
<property name="outboundHeaderNames" value="X-Request-Id...blabla"/>
<property name="inboundHeaderNames" value="X-AccessToken-Quota-Allotted, X-AccessToken-Quota-Current"/>
<property name="userDefinedHeaderPrefix" value=""/>
</bean>
以下是回复。我可以在 headers 属性中看到 X-AccessToken-Quota-Allotted & X-AccessToken-Quota-Current。
[integration] GenericMessage [payload={"type":"commonResponse","serverName":"uslxacd20022use1c.intranet.local","errorMessage":null}, headers={errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@41208186, X-Request-Id=0ce88cd6-d04b-47dc-b3db-224656fe9090, uri=https://api-server.com/blabla, http_statusCode=200, X-AccessToken-Quota-Allotted=5000, jsonObjectName=DmsCommonResponseDto, Authorization=Bearer qqdtbhtp5vk2ss69wjpbdfvh, replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@41208186, json__TypeId__=class com.blabla.DmsPhoneRequestDto, requestId=0ce88cd6-d04b-47dc-b3db-224656fe9090, X-AccessToken-Quota-Current=3, id=12072f4b-8403-a328-6a77-aaba935beba2, contentType=application/json, Content-Type=application/json;charset=UTF-8, timestamp=1592791409206}]
几乎每个字段值都映射到 responseDto 的字段,但我不知道如何将 X-custom header 值映射到 responseDto 的字段。
以下是当前设置。
<int:gateway id="dmsHttpPUTGateway" service-interface="blabla.gateway.DmsHttpPUTGateway"
default-request-channel="dms.put.ch.request.header.router"><int:method name="call" /></int:gateway>
<int:header-value-router input-channel="dms.put.ch.reply.header.router" header-name="jsonObjectName">
<int:mapping value="DmsCommonResponseDto" channel="dms.put.ch.reply.transformer.DmsCommonResponseDto"/>
</int:header-value-router>
<int:channel id="dms.put.ch.reply.transformer.DmsCommonResponseDto"></int:channel>
<int:json-to-object-transformer input-channel="dms.put.ch.reply.transformer.DmsCommonResponseDto" output-channel="dms.put.ch.reply" type="blabla.DmsCommonResponseDto"></int:json-to-object-transformer>
DmsCommonResponseDto.java
private static final long serialVersionUID = 1L;
private String serverName;
private DmsErrorMessageDto errorMessage;
private Date responseDate;
...setter, getter method.
即使是一点点线索也会有所帮助。提前致谢。
听起来您需要 json 变压器下游的自定义变压器。
class MyTransformer extends AbstractTransformer {
protected abstract Object doTransform(Message<?> message) {
DmsCommonResponseDto dto = (DmsCommonResponseDto) message.getPayload();
dto.setRequestId(message.getHeaders.get("X-request-id"));
...
return dto.
}
}