From ecc625b6d879ed3f06bf417223849a52e56e4db4 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 15 Jul 2020 10:36:57 +0200 Subject: [PATCH] GH-557 Add special handling for wild-card content type and subtype Add special handling for wild-card content type and subtype to NegotiatingMessageConverterWrapper Add author tags Resolves #557 --- .../NegotiatingMessageConverterWrapper.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/NegotiatingMessageConverterWrapper.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/NegotiatingMessageConverterWrapper.java index ddf5d61d5..5ac9540c5 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/NegotiatingMessageConverterWrapper.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/NegotiatingMessageConverterWrapper.java @@ -35,6 +35,9 @@ import org.springframework.util.MimeType; * negotiation when producing messages. To that effect, messages should contain an "accept" header, that may * contain a wildcard type (such as {@code text/*}, which may be tested against every * {@link AbstractMessageConverter#getSupportedMimeTypes() supported mime type} of the delegate MessageConverter. + * + * @author Eric Bottard + * @author Oleg Zhurakousky */ public final class NegotiatingMessageConverterWrapper implements SmartMessageConverter { @@ -118,22 +121,24 @@ public final class NegotiatingMessageConverterWrapper implements SmartMessageCon } if (accepted != null) { + Message result = null; for (MimeType supportedConcreteType : delegate.getSupportedMimeTypes()) { - if (accepted.includes(supportedConcreteType)) { + if (supportedConcreteType.isWildcardType() || supportedConcreteType.isWildcardSubtype()) { + result = delegate.toMessage(payload, accessor.toMessageHeaders(), conversionHint); + } + if (result == null && accepted.includes(supportedConcreteType)) { // Note the use of setHeader() which will set the value even if already present. accessor.setHeader(MessageHeaders.CONTENT_TYPE, supportedConcreteType); - Message result = delegate.toMessage(payload, accessor.toMessageHeaders(), conversionHint); - if (result != null) { - return result; - } + result = delegate.toMessage(payload, accessor.toMessageHeaders(), conversionHint); + } + if (result != null) { + return result; } } } return null; } - - @Override public Message toMessage(Object payload, MessageHeaders headers) { return toMessage(payload, headers, null);