Spring 集成 ObjectToJsonTransformer 和 headers 响应传播
Spring Integration ObjectToJsonTransformer and headers propagation in response
我正在设置一个应该执行以下操作的集成流程:
接受一个 object 将它序列化为 JSON 通过 TCP 套接字发送它 接收一个 JSON 响应 将它反序列化为一个 object(与输入一个)
为了执行序列化和反序列化,我使用了两个 @Transformer
,即 ObjectToJsonTransformer
和 JsonToObjectTransformer
。
我的问题是 ObjectToJsonTransformer
创建了一个 Message
,它在其 headers 中包含序列化 object 的类型,并且这些 headers 被传播到我从远程端点收到的响应。我希望收到的 Message
是全新的,但它不是,我也不完全明白为什么。
这些 headers 仍然存在导致响应被反序列化为输入 object 类型而不是所需的输出类型。
我的解决方法是将此行添加到我的 MessageHandler
:
tcpOutboundGateway.setNotPropagatedHeaders(JsonHeaders.HEADERS.toArray(new String[0]));
但我觉得我做错了什么。
这是我到目前为止所做的:
@EnableIntegration
@IntegrationComponentScan
@Configuration
public class TcpConfiguration {
private static final String REQUEST_OBJECT_CHANNEL = "REQUEST_OBJECT_CHANNEL";
private static final String REQUEST_JSON_CHANNEL = "REQUEST_JSON_CHANNEL";
private static final String RESPONSE_JSON_CHANNEL = "RESPONSE_JSON_CHANNEL";
@Value(value = "${ip}")
private String ip;
@Value(value = "${port}")
private Integer port;
@Bean
public AbstractClientConnectionFactory clientConnectionFactory() {
return new TcpNetClientConnectionFactory(this.ip, this.port);
}
@Bean
@Transformer(inputChannel = REQUEST_OBJECT_CHANNEL, outputChannel = REQUEST_JSON_CHANNEL)
public ObjectToJsonTransformer objectToJsonTransformer() {
return new ObjectToJsonTransformer();
}
@Bean
@ServiceActivator(inputChannel = REQUEST_JSON_CHANNEL)
public MessageHandler tcpOutputGateway(final AbstractClientConnectionFactory connectionFactory) {
final var tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(connectionFactory);
tcpOutboundGateway.setNotPropagatedHeaders(JsonHeaders.HEADERS.toArray(new String[0]));
tcpOutboundGateway.setOutputChannelName(RESPONSE_JSON_CHANNEL);
return tcpOutboundGateway;
}
@Bean
@Transformer(inputChannel = RESPONSE_JSON_CHANNEL)
public JsonToObjectTransformer jsonToObjectTransformer() {
return new JsonToObjectTransformer(MyResponse.class);
}
@MessagingGateway
public interface StandaloneGateway {
@Gateway(requestChannel = REQUEST_OBJECT_CHANNEL)
MyResponse sendRequestAndGetResponse(MyRequest request);
}
}
使用此代码我可以正确反序列化对 MyResponse
的响应,但如果我删除此行
tcpOutboundGateway.setNotPropagatedHeaders(JsonHeaders.HEADERS.toArray(new String[0]));
然后响应反序列化为 MyRequest
。
有没有更好的方法来处理这个流程?
默认情况下,网关始终复制入站 headers。
您的解决方案是正确的,但还有一个替代方案。
new JsonToObjectTransformer(MyResponse.class);
当 headers 不存在时,类型是 fall-back。
首先参考valueTypeExpression
(5.2.6版本开始),默认使用headers。
另一种方法是设置不同的表达式:
ResolvableType type = ResolvableType.forClass(TestPerson.class);
transformer.setValueTypeExpression(new ValueExpression<>(type));
然后 headers 将被忽略。
我正在设置一个应该执行以下操作的集成流程:
接受一个 object 将它序列化为 JSON 通过 TCP 套接字发送它 接收一个 JSON 响应 将它反序列化为一个 object(与输入一个)
为了执行序列化和反序列化,我使用了两个 @Transformer
,即 ObjectToJsonTransformer
和 JsonToObjectTransformer
。
我的问题是 ObjectToJsonTransformer
创建了一个 Message
,它在其 headers 中包含序列化 object 的类型,并且这些 headers 被传播到我从远程端点收到的响应。我希望收到的 Message
是全新的,但它不是,我也不完全明白为什么。
这些 headers 仍然存在导致响应被反序列化为输入 object 类型而不是所需的输出类型。
我的解决方法是将此行添加到我的 MessageHandler
:
tcpOutboundGateway.setNotPropagatedHeaders(JsonHeaders.HEADERS.toArray(new String[0]));
但我觉得我做错了什么。
这是我到目前为止所做的:
@EnableIntegration
@IntegrationComponentScan
@Configuration
public class TcpConfiguration {
private static final String REQUEST_OBJECT_CHANNEL = "REQUEST_OBJECT_CHANNEL";
private static final String REQUEST_JSON_CHANNEL = "REQUEST_JSON_CHANNEL";
private static final String RESPONSE_JSON_CHANNEL = "RESPONSE_JSON_CHANNEL";
@Value(value = "${ip}")
private String ip;
@Value(value = "${port}")
private Integer port;
@Bean
public AbstractClientConnectionFactory clientConnectionFactory() {
return new TcpNetClientConnectionFactory(this.ip, this.port);
}
@Bean
@Transformer(inputChannel = REQUEST_OBJECT_CHANNEL, outputChannel = REQUEST_JSON_CHANNEL)
public ObjectToJsonTransformer objectToJsonTransformer() {
return new ObjectToJsonTransformer();
}
@Bean
@ServiceActivator(inputChannel = REQUEST_JSON_CHANNEL)
public MessageHandler tcpOutputGateway(final AbstractClientConnectionFactory connectionFactory) {
final var tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(connectionFactory);
tcpOutboundGateway.setNotPropagatedHeaders(JsonHeaders.HEADERS.toArray(new String[0]));
tcpOutboundGateway.setOutputChannelName(RESPONSE_JSON_CHANNEL);
return tcpOutboundGateway;
}
@Bean
@Transformer(inputChannel = RESPONSE_JSON_CHANNEL)
public JsonToObjectTransformer jsonToObjectTransformer() {
return new JsonToObjectTransformer(MyResponse.class);
}
@MessagingGateway
public interface StandaloneGateway {
@Gateway(requestChannel = REQUEST_OBJECT_CHANNEL)
MyResponse sendRequestAndGetResponse(MyRequest request);
}
}
使用此代码我可以正确反序列化对 MyResponse
的响应,但如果我删除此行
tcpOutboundGateway.setNotPropagatedHeaders(JsonHeaders.HEADERS.toArray(new String[0]));
然后响应反序列化为 MyRequest
。
有没有更好的方法来处理这个流程?
默认情况下,网关始终复制入站 headers。
您的解决方案是正确的,但还有一个替代方案。
new JsonToObjectTransformer(MyResponse.class);
当 headers 不存在时,类型是 fall-back。
首先参考valueTypeExpression
(5.2.6版本开始),默认使用headers。
另一种方法是设置不同的表达式:
ResolvableType type = ResolvableType.forClass(TestPerson.class);
transformer.setValueTypeExpression(new ValueExpression<>(type));
然后 headers 将被忽略。