commit
fd453a0753
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2019 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.
|
||||
|
@ -41,23 +41,23 @@ public final class MessageBuilder<T> {
|
|||
private final T payload;
|
||||
|
||||
@Nullable
|
||||
private final Message<T> originalMessage;
|
||||
private final Message<T> providedMessage;
|
||||
|
||||
private MessageHeaderAccessor headerAccessor;
|
||||
|
||||
|
||||
private MessageBuilder(Message<T> originalMessage) {
|
||||
Assert.notNull(originalMessage, "Message must not be null");
|
||||
this.payload = originalMessage.getPayload();
|
||||
this.originalMessage = originalMessage;
|
||||
this.headerAccessor = new MessageHeaderAccessor(originalMessage);
|
||||
private MessageBuilder(Message<T> providedMessage) {
|
||||
Assert.notNull(providedMessage, "Message must not be null");
|
||||
this.payload = providedMessage.getPayload();
|
||||
this.providedMessage = providedMessage;
|
||||
this.headerAccessor = new MessageHeaderAccessor(providedMessage);
|
||||
}
|
||||
|
||||
private MessageBuilder(T payload, MessageHeaderAccessor accessor) {
|
||||
Assert.notNull(payload, "Payload must not be null");
|
||||
Assert.notNull(accessor, "MessageHeaderAccessor must not be null");
|
||||
this.payload = payload;
|
||||
this.originalMessage = null;
|
||||
this.providedMessage = null;
|
||||
this.headerAccessor = accessor;
|
||||
}
|
||||
|
||||
|
@ -99,6 +99,7 @@ public final class MessageBuilder<T> {
|
|||
this.headerAccessor.removeHeaders(headerPatterns);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the value for the given header name.
|
||||
*/
|
||||
|
@ -148,11 +149,17 @@ public final class MessageBuilder<T> {
|
|||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Message<T> build() {
|
||||
if (this.originalMessage != null && !this.headerAccessor.isModified()) {
|
||||
return this.originalMessage;
|
||||
if (this.providedMessage != null && !this.headerAccessor.isModified()) {
|
||||
return this.providedMessage;
|
||||
}
|
||||
MessageHeaders headersToUse = this.headerAccessor.toMessageHeaders();
|
||||
if (this.payload instanceof Throwable) {
|
||||
if (this.providedMessage != null && this.providedMessage instanceof ErrorMessage) {
|
||||
Message<?> message = ((ErrorMessage) this.providedMessage).getOriginalMessage();
|
||||
if (message != null) {
|
||||
return (Message<T>) new ErrorMessage((Throwable) this.payload, headersToUse, message);
|
||||
}
|
||||
}
|
||||
return (Message<T>) new ErrorMessage((Throwable) this.payload, headersToUse);
|
||||
}
|
||||
else {
|
||||
|
@ -165,6 +172,9 @@ public final class MessageBuilder<T> {
|
|||
* Create a builder for a new {@link Message} instance pre-populated with all of the
|
||||
* headers copied from the provided message. The payload of the provided Message will
|
||||
* also be used as the payload for the new message.
|
||||
* <p>If the provided message is an {@link ErrorMessage}, the
|
||||
* {@link ErrorMessage#getOriginalMessage() originalMessage} it contains, will be
|
||||
* passed on to new instance.
|
||||
* @param message the Message from which the payload and all headers will be copied
|
||||
*/
|
||||
public static <T> MessageBuilder<T> fromMessage(Message<T> message) {
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package org.springframework.messaging.support;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -107,6 +108,19 @@ public class MessageBuilderTests {
|
|||
assertThat(message2.getHeaders().get("foo")).isEqualTo("bar");
|
||||
}
|
||||
|
||||
@Test // gh-23417
|
||||
public void createErrorMessageFromErrorMessage() {
|
||||
Message<String> source = MessageBuilder.withPayload("test").setHeader("foo", "bar").build();
|
||||
RuntimeException ex = new RuntimeException();
|
||||
ErrorMessage errorMessage1 = new ErrorMessage(ex, Collections.singletonMap("baz", "42"), source);
|
||||
Message<Throwable> errorMessage2 = MessageBuilder.fromMessage(errorMessage1).build();
|
||||
assertThat(errorMessage2).isExactlyInstanceOf(ErrorMessage.class);
|
||||
ErrorMessage actual = (ErrorMessage) errorMessage2;
|
||||
assertThat(actual.getPayload()).isSameAs(ex);
|
||||
assertThat(actual.getHeaders().get("baz")).isEqualTo("42");
|
||||
assertThat(actual.getOriginalMessage()).isSameAs(source);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createIdRegenerated() {
|
||||
Message<String> message1 = MessageBuilder.withPayload("test")
|
||||
|
|
Loading…
Reference in New Issue