diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java index 7c3f512ab..7ccc4de93 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java @@ -117,7 +117,7 @@ public class FunctionInvoker implements HttpFunction, RawBackgroundFunction { Message message = this.functionWrapped.getInputType() == Void.class || this.functionWrapped.getInputType() == null ? null : MessageBuilder.withPayload(httpRequest.getReader()).copyHeaders(httpRequest.getHeaders()).build(); - Message result = function.apply(message); + Message result = function.apply(message); if (result != null) { MessageHeaders headers = result.getHeaders(); @@ -130,7 +130,8 @@ public class FunctionInvoker implements HttpFunction, RawBackgroundFunction { else { httpRequest.getContentType().ifPresent(contentType -> httpResponse.setContentType(contentType)); } - httpResponse.getWriter().write(new String(result.getPayload(), StandardCharsets.UTF_8)); + String content = result.getPayload() instanceof String strPayload ? strPayload : new String((byte[]) result.getPayload(), StandardCharsets.UTF_8); + httpResponse.getWriter().write(content); for (Entry header : headers.entrySet()) { Object values = header.getValue(); if (values instanceof Collection) { diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java index 110d200c6..bc02ed8a0 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java @@ -55,7 +55,6 @@ import org.springframework.cloud.function.core.FunctionInvocationHelper; import org.springframework.cloud.function.json.GsonMapper; import org.springframework.cloud.function.json.JacksonMapper; import org.springframework.cloud.function.json.JsonMapper; -import org.springframework.cloud.function.utils.PrimitiveTypesFromStringMessageConverter; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -71,13 +70,17 @@ import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.lang.Nullable; import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.converter.ByteArrayMessageConverter; import org.springframework.messaging.converter.CompositeMessageConverter; +import org.springframework.messaging.converter.ContentTypeResolver; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.StringMessageConverter; import org.springframework.stereotype.Component; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; +import org.springframework.util.InvalidMimeTypeException; +import org.springframework.util.MimeType; import org.springframework.util.StringUtils; /** @@ -133,8 +136,23 @@ public class ContextFunctionCatalogAutoConfiguration { mcList.add(new JsonMessageConverter(jsonMapper)); mcList.add(new ByteArrayMessageConverter()); - mcList.add(new StringMessageConverter()); - mcList.add(new PrimitiveTypesFromStringMessageConverter(conversionService)); + StringMessageConverter stringConverter = new StringMessageConverter(); + stringConverter.setSerializedPayloadClass(String.class); + stringConverter.setContentTypeResolver(new ContentTypeResolver() { + @Override + public MimeType resolve(MessageHeaders headers) throws InvalidMimeTypeException { + if (headers.containsKey(MessageHeaders.CONTENT_TYPE)) { + if (headers.get(MessageHeaders.CONTENT_TYPE).toString().startsWith("text")) { + return MimeType.valueOf("text/plain"); + } + else { + return MimeType.valueOf(headers.get(MessageHeaders.CONTENT_TYPE).toString()); + } + } + return null; + } + }); + mcList.add(stringConverter); messageConverter = new SmartCompositeMessageConverter(mcList, () -> { return context.getBeansOfType(MessageConverterHelper.class).values();