From 9c777b8d044fd188b7a43542126a0d4647d62d48 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 20 Nov 2020 22:40:49 +0100 Subject: [PATCH] GH-611 Fix regression for expectedContentType --- .../catalog/SimpleFunctionRegistry.java | 18 ++------ ...BeanFactoryAwareFunctionRegistryTests.java | 46 +++++++++++++++++++ 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java index 1d7d0e2c6..f7245777b 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java @@ -735,23 +735,11 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect Message outputMessage = null; if (value instanceof Message) { MessageHeaders headers = ((Message) value).getHeaders(); - Map headersMap = (Map) ReflectionUtils - .getField(this.headersField, headers); - headersMap.put("accept", acceptedContentType); - // Set the contentType header to the value of accept for "legacy" reasons. But, do not set the - // contentType header to the value of accept if it is a wildcard type, as this doesn't make sense. - // This also applies to the else branch below. - if (acceptedContentType.isConcrete() && !headersMap.containsKey(MessageHeaders.CONTENT_TYPE)) { - headersMap.put(MessageHeaders.CONTENT_TYPE, acceptedContentType); - } + Map headersMap = (Map) ReflectionUtils.getField(this.headersField, headers); + headersMap.putIfAbsent(MessageHeaders.CONTENT_TYPE, acceptedContentType); } else { - MessageBuilder builder = MessageBuilder.withPayload(value) - .setHeader("accept", acceptedContentType); - if (acceptedContentType.isConcrete()) { - builder.setHeader(MessageHeaders.CONTENT_TYPE, acceptedContentType); - } - value = builder.build(); + value = MessageBuilder.withPayload(value).setHeader(MessageHeaders.CONTENT_TYPE, acceptedContentType).build(); } if (enricher != null) { value = enricher.apply((Message) value); diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java index c23e5c2a1..9c6c58746 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java @@ -59,6 +59,7 @@ import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.MimeType; +import org.springframework.util.MimeTypeUtils; import org.springframework.util.ReflectionUtils; import static java.util.Collections.singletonList; @@ -531,6 +532,13 @@ public class BeanFactoryAwareFunctionRegistryTests { assertThat(result.block()).isEqualTo("hello"); } + @Test + public void testGH_611() { + FunctionCatalog catalog = this.configureCatalog(NegotiatingMessageConverterConfiguration.class); + Supplier> f = catalog.lookup("supplier", "text/*"); + assertThat(f.get().getHeaders().get(MessageHeaders.CONTENT_TYPE)).isEqualTo(MimeTypeUtils.parseMimeType("text/*")); + } + @EnableAutoConfiguration public static class PojoToMessageFunctionCompositionConfiguration { @@ -595,6 +603,11 @@ public class BeanFactoryAwareFunctionRegistryTests { @EnableAutoConfiguration public static class NegotiatingMessageConverterConfiguration { + @Bean + public Supplier supplier() { + return () -> 123; + } + @Bean public Function echo() { return v -> v; @@ -610,6 +623,11 @@ public class BeanFactoryAwareFunctionRegistryTests { return new ConverterB(); } + @Bean + public MessageConverter messageConverterC() { + return new ConverterC(); + } + public static class ConverterB extends ConverterA { ConverterB() { @@ -639,6 +657,34 @@ public class BeanFactoryAwareFunctionRegistryTests { } } + public static class ConverterC extends ConverterA { + ConverterC() { + super("text/*"); + } + + @Override + protected Object convertFromInternal( + Message message, Class targetClass, @Nullable Object conversionHint) { + return message.getPayload().toString(); + } + + @Override + public Object convertToInternal(Object rawPayload, MessageHeaders headers, Object conversionHint) { + return rawPayload; + } + + @Override + protected boolean canConvertFrom(Message message, @Nullable Class targetClass) { + return supportsMimeType(message.getHeaders()) && Integer.class.isAssignableFrom(targetClass) + && message.getPayload() instanceof Integer; + } + + @Override + protected boolean canConvertTo(Object payload, @Nullable MessageHeaders headers) { + return payload instanceof Integer; + } + } + private static class ConverterA extends AbstractMessageConverter { ConverterA() {