Copy request headers when reply is not a Message (#3478)
* Copy request headers when reply is not a Message Related to https://stackoverflow.com/questions/65887787/spring-integration-unexpected-behavior-on-error-handling-in-splitter-aggregator Typically `AbstractMessageProducingHandler` implementation with the `shouldCopyRequestHeaders = false` returns a `Message`(or `MessageBuilder`) as a reply, but when some request handler `Advice` is involved, we may produce a plain payload and the reply message does not have request headers * Improve `AbstractMessageProducingHandler` logic to copy request headers into a reply message builder, when the original reply is not a `Message` or `MessageBuilder`. This way we improve end-user experience and set them free from copying those headers manually * Justify a new behavior with the `TransformerTests.testFailedTransformWithRequestHeadersCopy()` * * Fix Checkstyle violations
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2014-2020 the original author or authors.
|
||||
* Copyright 2014-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -162,7 +162,7 @@ public abstract class AbstractMessageProducingHandler extends AbstractMessageHan
|
||||
}
|
||||
|
||||
if (headerPatterns.contains("*")) {
|
||||
this.notPropagatedHeaders = new String[] { "*" };
|
||||
this.notPropagatedHeaders = new String[]{ "*" };
|
||||
this.noHeadersPropagation = true;
|
||||
}
|
||||
|
||||
@@ -411,15 +411,19 @@ public abstract class AbstractMessageProducingHandler extends AbstractMessageHan
|
||||
if (this.noHeadersPropagation || !shouldCopyRequestHeaders()) {
|
||||
return (Message<?>) output;
|
||||
}
|
||||
builder = this.getMessageBuilderFactory().fromMessage((Message<?>) output);
|
||||
builder = getMessageBuilderFactory().fromMessage((Message<?>) output);
|
||||
}
|
||||
else if (output instanceof AbstractIntegrationMessageBuilder) {
|
||||
builder = (AbstractIntegrationMessageBuilder<?>) output;
|
||||
}
|
||||
else {
|
||||
builder = this.getMessageBuilderFactory().withPayload(output);
|
||||
builder = getMessageBuilderFactory().withPayload(output);
|
||||
}
|
||||
if (!this.noHeadersPropagation && shouldCopyRequestHeaders()) {
|
||||
if (!this.noHeadersPropagation &&
|
||||
(shouldCopyRequestHeaders() ||
|
||||
(!(output instanceof Message<?>) &&
|
||||
!(output instanceof AbstractIntegrationMessageBuilder<?>)))) {
|
||||
|
||||
builder.filterAndCopyHeadersIfAbsent(requestHeaders,
|
||||
this.selectiveHeaderPropagation ? this.notPropagatedHeaders : null);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user