diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java index 1f1c937c2e..4c92cfad26 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java @@ -32,8 +32,8 @@ import org.springframework.util.Assert; import org.springframework.util.MimeType; /** - * Abstract base class for {@link MessageConverter} implementations including support - * for common properties and a partial implementation of the conversion methods, + * Abstract base class for {@link SmartMessageConverter} implementations including + * support for common properties and a partial implementation of the conversion methods, * mainly to check if the converter supports the conversion based on the payload class * and MIME type. * @@ -42,7 +42,7 @@ import org.springframework.util.MimeType; * @author Juergen Hoeller * @since 4.0 */ -public abstract class AbstractMessageConverter implements MessageConverter { +public abstract class AbstractMessageConverter implements SmartMessageConverter { protected final Log logger = LogFactory.getLog(getClass()); @@ -167,19 +167,7 @@ public abstract class AbstractMessageConverter implements MessageConverter { return fromMessage(message, targetClass, null); } - /** - * A variant of {@link #fromMessage(Message, Class)} which takes an extra - * conversion context as an argument, allowing to take e.g. annotations - * on a payload parameter into account. - * @param message the input message - * @param targetClass the target class for the conversion - * @param conversionHint an extra object passed to the {@link MessageConverter}, - * e.g. the associated {@code MethodParameter} (may be {@code null}} - * @return the result of the conversion, or {@code null} if the converter cannot - * perform the conversion - * @since 4.2 - * @see #fromMessage(Message, Class) - */ + @Override public final Object fromMessage(Message> message, Class> targetClass, Object conversionHint) { if (!canConvertFrom(message, targetClass)) { return null; @@ -196,19 +184,7 @@ public abstract class AbstractMessageConverter implements MessageConverter { return toMessage(payload, headers, null); } - /** - * A variant of {@link #toMessage(Object, MessageHeaders)} which takes an extra - * conversion context as an argument, allowing to take e.g. annotations - * on a return type into account. - * @param payload the Object to convert - * @param headers optional headers for the message (may be {@code null}) - * @param conversionHint an extra object passed to the {@link MessageConverter}, - * e.g. the associated {@code MethodParameter} (may be {@code null}} - * @return the new message, or {@code null} if the converter does not support the - * Object type or the target media type - * @since 4.2 - * @see #toMessage(Object, MessageHeaders) - */ + @Override public final Message> toMessage(Object payload, MessageHeaders headers, Object conversionHint) { if (!canConvertTo(payload, headers)) { return null; 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 8b3099bb40..ee39375931 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-2014 the original author or authors. + * Copyright 2002-2015 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. @@ -25,13 +25,17 @@ import org.springframework.messaging.MessageHeaders; import org.springframework.util.Assert; /** - * A {@link MessageConverter} that delegates to a list of other converters + * A {@link MessageConverter} that delegates to a list of registered converters * to be invoked until one of them returns a non-null result. * + *
As of 4.2.1, this composite converter implements {@link SmartMessageConverter}
+ * in order to support the delegation of conversion hints.
+ *
* @author Rossen Stoyanchev
+ * @author Juergen Hoeller
* @since 4.0
*/
-public class CompositeMessageConverter implements MessageConverter {
+public class CompositeMessageConverter implements SmartMessageConverter {
private final List In case of a conversion hint being provided, the framework will call
+ * these extended methods if a converter implements this interface, instead
+ * of calling the regular {@code fromMessage} / {@code toMessage} variants.
+ *
+ * @author Juergen Hoeller
+ * @since 4.2.1
+ */
+public interface SmartMessageConverter extends MessageConverter {
+
+ /**
+ * A variant of {@link #fromMessage(Message, Class)} which takes an extra
+ * conversion context as an argument, allowing to take e.g. annotations
+ * on a payload parameter into account.
+ * @param message the input message
+ * @param targetClass the target class for the conversion
+ * @param conversionHint an extra object passed to the {@link MessageConverter},
+ * e.g. the associated {@code MethodParameter} (may be {@code null}}
+ * @return the result of the conversion, or {@code null} if the converter cannot
+ * perform the conversion
+ * @see #fromMessage(Message, Class)
+ */
+ Object fromMessage(Message> message, Class> targetClass, Object conversionHint);
+
+ /**
+ * A variant of {@link #toMessage(Object, MessageHeaders)} which takes an extra
+ * conversion context as an argument, allowing to take e.g. annotations
+ * on a return type into account.
+ * @param payload the Object to convert
+ * @param headers optional headers for the message (may be {@code null})
+ * @param conversionHint an extra object passed to the {@link MessageConverter},
+ * e.g. the associated {@code MethodParameter} (may be {@code null}}
+ * @return the new message, or {@code null} if the converter does not support the
+ * Object type or the target media type
+ * @see #toMessage(Object, MessageHeaders)
+ */
+ Message> toMessage(Object payload, MessageHeaders headers, Object conversionHint);
+
+}
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 ca98c9e270..2475de7fd7 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
@@ -24,10 +24,10 @@ 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.AbstractMessageConverter;
import org.springframework.messaging.converter.MessageConversionException;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.converter.SimpleMessageConverter;
+import org.springframework.messaging.converter.SmartMessageConverter;
import org.springframework.util.Assert;
/**
@@ -167,8 +167,8 @@ public abstract class AbstractMessageSendingTemplate