From efb2b434093ba03b211dc14ef9646b28bb071d8d Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Mon, 25 Jul 2022 15:13:18 +0200 Subject: [PATCH] Remove reflection usage to accomodate AOT --- .../catalog/SimpleFunctionRegistry.java | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 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 e62b82d1f..8fdc979ed 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 @@ -16,7 +16,6 @@ package org.springframework.cloud.function.context.catalog; -import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; @@ -69,7 +68,6 @@ import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; -import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -90,8 +88,6 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect * */ - private final Field headersField; - private final Set> functionRegistrations = new CopyOnWriteArraySet<>(); private final Map wrappedFunctionDefinitions = new HashMap<>(); @@ -117,8 +113,6 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect this.conversionService = conversionService; this.jsonMapper = jsonMapper; this.messageConverter = messageConverter; - this.headersField = ReflectionUtils.findField(MessageHeaders.class, "headers"); - this.headersField.setAccessible(true); this.functionInvocationHelper = functionInvocationHelper; this.functionProperties = functionProperties; } @@ -782,7 +776,6 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect /** * Will wrap the result in a Message if necessary and will copy input headers to the output message. */ - @SuppressWarnings("unchecked") private Object enrichInvocationResultIfNecessary(Object input, Object result) { if (result != null && !(result instanceof Publisher) && input instanceof Message) { if (result instanceof Message) { @@ -790,9 +783,9 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect result = functionInvocationHelper.postProcessResult(result, (Message) input); } else { - Map headersMap = (Map) ReflectionUtils - .getField(SimpleFunctionRegistry.this.headersField, ((Message) result).getHeaders()); - this.sanitizeHeaders(((Message) input).getHeaders()).forEach((k, v) -> headersMap.putIfAbsent(k, v)); + Map headersMap = new HashMap<>(((Message) result).getHeaders()); + this.sanitizeHeaders(((Message) result).getHeaders()).forEach((k, v) -> headersMap.putIfAbsent(k, v)); + result = MessageBuilder.withPayload(((Message) result).getPayload()).copyHeaders(headersMap).build(); } } else { @@ -1182,10 +1175,9 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect output = enhancer.apply(output); } if (this.getTarget() instanceof PassThruFunction) { // scst-2303 - Map headersMap = (Map) ReflectionUtils - .getField(SimpleFunctionRegistry.this.headersField, ((Message) output).getHeaders()); - headersMap.put(MessageHeaders.CONTENT_TYPE, contentType[0]); - return messageConverter.toMessage(((Message) output).getPayload(), ((Message) output).getHeaders()); + Message enrichedMessage = MessageBuilder.fromMessage((Message) output) + .setHeader(MessageHeaders.CONTENT_TYPE, contentType[0]).build(); + return messageConverter.toMessage(enrichedMessage.getPayload(), enrichedMessage.getHeaders()); } if (ObjectUtils.isEmpty(contentType) && !(output instanceof Publisher)) { @@ -1380,17 +1372,17 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect */ @SuppressWarnings("unchecked") private Object convertOutputMessageIfNecessary(Object output, String expectedOutputContetntType) { - Map headersMap = (Map) ReflectionUtils - .getField(SimpleFunctionRegistry.this.headersField, ((Message) output).getHeaders()); String contentType = ((Message) output).getHeaders().containsKey(FunctionProperties.EXPECT_CONTENT_TYPE_HEADER) ? (String) ((Message) output).getHeaders().get(FunctionProperties.EXPECT_CONTENT_TYPE_HEADER) : expectedOutputContetntType; if (StringUtils.hasText(contentType)) { + Map headersMap = new HashMap(((Message) output).getHeaders()); String[] expectedContentTypes = StringUtils.delimitedListToStringArray(contentType, ","); for (String expectedContentType : expectedContentTypes) { headersMap.put(MessageHeaders.CONTENT_TYPE, expectedContentType); - Object result = messageConverter.toMessage(((Message) output).getPayload(), ((Message) output).getHeaders()); + Message message = MessageBuilder.withPayload(((Message) output).getPayload()).copyHeaders(headersMap).build(); + Object result = messageConverter.toMessage(message.getPayload(), message.getHeaders()); if (result != null) { return result; }