GH-2217: JSON: Populated actual ID & TIMESTAMP

Fixes spring-projects/spring-integration#2217

The `MutableMessageHeaders` delegates provided headers to the super
which just generates fresh `ID` & `TIMESTAMP` headers ignoring provided.

* Add explicit `ID` & `TIMESTAMP` headers population in the
`MessageJacksonDeserializer` after creation `MutableMessageHeaders`.
We can't apply the fix for the `MutableMessageHeaders` like it is in
the `master` because it would be a breaking change
This commit is contained in:
Artem Bilan
2017-08-17 14:40:32 -04:00
committed by Gary Russell
parent a4992da074
commit c877b041d4
3 changed files with 40 additions and 9 deletions

View File

@@ -22,6 +22,7 @@ import java.util.Map;
import org.springframework.integration.support.MutableMessageHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.util.Assert;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@@ -71,7 +72,10 @@ public abstract class MessageJacksonDeserializer<T extends Message<?>> extends S
Map<String, Object> headers = this.mapper.readValue(root.get("headers").traverse(),
TypeFactory.defaultInstance().constructMapType(HashMap.class, String.class, Object.class));
Object payload = this.mapper.readValue(root.get("payload").traverse(), this.payloadType);
return buildMessage(new MutableMessageHeaders(headers), payload, root, ctxt);
MutableMessageHeaders messageHeaders = new MutableMessageHeaders(headers);
messageHeaders.put(MessageHeaders.ID, headers.get(MessageHeaders.ID));
messageHeaders.put(MessageHeaders.TIMESTAMP, headers.get(MessageHeaders.TIMESTAMP));
return buildMessage(messageHeaders, payload, root, ctxt);
}
protected abstract T buildMessage(MutableMessageHeaders headers, Object payload, JsonNode root,