Spring 集成 ObjectToJsonTransformer 和 headers 响应传播

Spring Integration ObjectToJsonTransformer and headers propagation in response

我正在设置一个应该执行以下操作的集成流程:

接受一个 object 将它序列化为 JSON 通过 TCP 套接字发送它 接收一个 JSON 响应 将它反序列化为一个 object(与输入一个)

为了执行序列化和反序列化,我使用了两个 @Transformer,即 ObjectToJsonTransformerJsonToObjectTransformer

我的问题是 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 将被忽略。