diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/CompositeMessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/CompositeMessageConverter.java index 77b24337e5..90a51b1bc1 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/CompositeMessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/CompositeMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -106,4 +106,9 @@ public class CompositeMessageConverter implements MessageConverter { return null; } + @Override + public String toString() { + return "CompositeMessageConverter[contentTypeResolver=" + this.contentTypeResolver + + ", converters=" + this.converters + "]"; + } } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java index aae37a294c..1d9e273ccb 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/DefaultContentTypeResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -56,4 +56,8 @@ public class DefaultContentTypeResolver implements ContentTypeResolver { return (mimeType != null) ? mimeType : this.defaultMimeType; } + @Override + public String toString() { + return "DefaultContentTypeResolver[" + "defaultMimeType=" + this.defaultMimeType + "]"; + } } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java index 56f0107a73..3166e4bc75 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessagingException; +import org.springframework.messaging.converter.MessageConversionException; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.SimpleMessageConverter; import org.springframework.util.Assert; @@ -130,6 +131,14 @@ public abstract class AbstractMessageSendingTemplate implements MessageSendin MessageHeaders messageHeaders = (headers != null) ? new MessageHeaders(headers) : null; Message message = this.converter.toMessage(payload, messageHeaders); + + if (message == null) { + String payloadType = (payload != null) ? payload.getClass().getName() : null; + throw new MessageConversionException("Unable to convert payload type '" + + payloadType + "', Content-Type=" + messageHeaders.get(MessageHeaders.CONTENT_TYPE) + + ", converter=" + this.converter, null); + } + if (postProcessor != null) { message = postProcessor.postProcessMessage(message); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessagingTemplate.java b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessagingTemplate.java index 8cf3c2e47b..222ef34fe5 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessagingTemplate.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessagingTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -20,6 +20,7 @@ import java.util.Map; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.converter.MessageConversionException; /** * An extension of {@link AbstractMessageSendingTemplate} that adds support for @@ -116,9 +117,18 @@ public abstract class AbstractMessagingTemplate extends AbstractMessageSendin MessageHeaders messageHeaders = (headers != null) ? new MessageHeaders(headers) : null; Message requestMessage = getMessageConverter().toMessage(request, messageHeaders); + + if (requestMessage == null) { + String payloadType = (request != null) ? request.getClass().getName() : null; + throw new MessageConversionException("Unable to convert payload type '" + + payloadType + "', Content-Type=" + messageHeaders.get(MessageHeaders.CONTENT_TYPE) + + ", converter=" + getMessageConverter(), null); + } + if (postProcessor != null) { requestMessage = postProcessor.postProcessMessage(requestMessage); } + Message replyMessage = this.sendAndReceive(destination, requestMessage); return (replyMessage != null) ? (T) getMessageConverter().fromMessage(replyMessage, targetClass) : null; } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/core/MessageSendingTemplateTests.java b/spring-messaging/src/test/java/org/springframework/messaging/core/MessageSendingTemplateTests.java index 9ab579095b..1bbad60ec4 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/core/MessageSendingTemplateTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/core/MessageSendingTemplateTests.java @@ -16,14 +16,20 @@ package org.springframework.messaging.core; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.converter.*; import org.springframework.messaging.support.GenericMessage; +import org.springframework.util.MimeType; +import org.springframework.util.MimeTypeUtils; import static org.junit.Assert.*; @@ -45,7 +51,8 @@ public class MessageSendingTemplateTests { public void setup() { this.template = new TestMessageSendingTemplate(); this.postProcessor = new TestMessagePostProcessor(); - this.headers = Collections.singletonMap("key", "value"); + this.headers = new HashMap<>(); + this.headers.put("key", "value"); } @Test @@ -144,6 +151,17 @@ public class MessageSendingTemplateTests { assertSame(this.template.message, this.postProcessor.getMessage()); } + @Test(expected = MessageConversionException.class) + public void convertAndSendNoMatchingConverter() { + + MessageConverter converter = new CompositeMessageConverter( + Arrays.asList(new MappingJackson2MessageConverter()), new DefaultContentTypeResolver()); + this.template.setMessageConverter(converter); + + this.headers.put(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_XML); + this.template.convertAndSend("home", "payload", new MessageHeaders(this.headers)); + } + private static class TestMessageSendingTemplate extends AbstractMessageSendingTemplate {