diff --git a/.github/dco.yml b/.github/dco.yml
new file mode 100644
index 000000000..0c4b142e9
--- /dev/null
+++ b/.github/dco.yml
@@ -0,0 +1,2 @@
+require:
+ members: false
diff --git a/README.adoc b/README.adoc
index b47e2bd96..1a4c4f276 100644
--- a/README.adoc
+++ b/README.adoc
@@ -31,15 +31,11 @@ tracker for issues and merging pull requests into main. If you want
to contribute even something trivial please do not hesitate, but
follow the guidelines below.
-[[sign-the-contributor-license-agreement]]
-== Sign the Contributor License Agreement
+[[developer-certificate-of-origin]]
+== Developer Certificate of Origin (DCO)
-Before we accept a non-trivial patch or pull request we will need you to sign the
-https://cla.pivotal.io/sign/spring[Contributor License Agreement].
-Signing the contributor's agreement does not grant anyone commit rights to the main
-repository, but it does mean that we can accept your contributions, and you will get an
-author credit if we do. Active contributors might be asked to join the core team, and
-given the ability to merge pull requests.
+All commits must include a __Signed-off-by__ trailer at the end of each commit message to indicate that the contributor agrees to the Developer Certificate of Origin.
+For additional details, please refer to the blog post https://spring.io/blog/2025/01/06/hello-dco-goodbye-cla-simplifying-contributions-to-spring[Hello DCO, Goodbye CLA: Simplifying Contributions to Spring].
[[code-of-conduct]]
== Code of Conduct
@@ -219,7 +215,7 @@ Spring Cloud Build brings along the `basepom:duplicate-finder-maven-plugin`, th
[[duplicate-finder-configuration]]
=== Duplicate Finder configuration
-Duplicate finder is *enabled by default* and will run in the `verify` phase of your Maven build, but it will only take effect in your project if you add the `duplicate-finder-maven-plugin` to the `build` section of the projecst's `pom.xml`.
+Duplicate finder is *enabled by default* and will run in the `verify` phase of your Maven build, but it will only take effect in your project if you add the `duplicate-finder-maven-plugin` to the `build` section of the project's `pom.xml`.
.pom.xml
[source,xml]
@@ -276,15 +272,11 @@ tracker for issues and merging pull requests into main. If you want
to contribute even something trivial please do not hesitate, but
follow the guidelines below.
-[[sign-the-contributor-license-agreement]]
-== Sign the Contributor License Agreement
+[[developer-certificate-of-origin]]
+== Developer Certificate of Origin (DCO)
-Before we accept a non-trivial patch or pull request we will need you to sign the
-https://cla.pivotal.io/sign/spring[Contributor License Agreement].
-Signing the contributor's agreement does not grant anyone commit rights to the main
-repository, but it does mean that we can accept your contributions, and you will get an
-author credit if we do. Active contributors might be asked to join the core team, and
-given the ability to merge pull requests.
+All commits must include a __Signed-off-by__ trailer at the end of each commit message to indicate that the contributor agrees to the Developer Certificate of Origin.
+For additional details, please refer to the blog post https://spring.io/blog/2025/01/06/hello-dco-goodbye-cla-simplifying-contributions-to-spring[Hello DCO, Goodbye CLA: Simplifying Contributions to Spring].
[[code-of-conduct]]
== Code of Conduct
@@ -464,7 +456,7 @@ Spring Cloud Build brings along the `basepom:duplicate-finder-maven-plugin`, th
[[duplicate-finder-configuration]]
=== Duplicate Finder configuration
-Duplicate finder is *enabled by default* and will run in the `verify` phase of your Maven build, but it will only take effect in your project if you add the `duplicate-finder-maven-plugin` to the `build` section of the projecst's `pom.xml`.
+Duplicate finder is *enabled by default* and will run in the `verify` phase of your Maven build, but it will only take effect in your project if you add the `duplicate-finder-maven-plugin` to the `build` section of the project's `pom.xml`.
.pom.xml
[source,xml]
diff --git a/docs/pom.xml b/docs/pom.xml
index 2667f448d..87203df0b 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -8,7 +8,7 @@
org.springframework.cloudspring-cloud-function-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTjarSpring Cloud Function Docs
diff --git a/pom.xml b/pom.xml
index d31406aa6..0a4fa7428 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,13 +6,13 @@
spring-cloud-function-parentSpring Cloud Function Parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTpomorg.springframework.cloudspring-cloud-build
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-adapters/pom.xml b/spring-cloud-function-adapters/pom.xml
index 972ac286b..fb66872a1 100644
--- a/spring-cloud-function-adapters/pom.xml
+++ b/spring-cloud-function-adapters/pom.xml
@@ -10,7 +10,7 @@
org.springframework.cloudspring-cloud-function-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTspring-cloud-function-adapter-parent
diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/pom.xml
index 040ba71a1..15e7523f4 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/pom.xml
@@ -13,13 +13,13 @@
org.springframework.cloudspring-cloud-function-adapter-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTUTF-8UTF-8
- 3.11.4
+ 3.14.01.12.291.0.11.1.5
diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSTypesMessageConverter.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSTypesMessageConverter.java
index 9c5c0bd39..7077a1595 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSTypesMessageConverter.java
+++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSTypesMessageConverter.java
@@ -17,11 +17,14 @@
package org.springframework.cloud.function.adapter.aws;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import com.amazonaws.services.lambda.runtime.serialization.PojoSerializer;
import com.amazonaws.services.lambda.runtime.serialization.events.LambdaEventSerializers;
+import com.amazonaws.services.lambda.runtime.serialization.events.serializers.S3EventSerializer;
import org.springframework.cloud.function.cloudevent.CloudEventMessageUtils;
import org.springframework.cloud.function.context.config.JsonMessageConverter;
@@ -30,6 +33,7 @@ import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.converter.MessageConverter;
+import org.springframework.util.ClassUtils;
import org.springframework.util.MimeType;
/**
@@ -44,6 +48,9 @@ class AWSTypesMessageConverter extends JsonMessageConverter {
private final JsonMapper jsonMapper;
+ @SuppressWarnings("rawtypes")
+ private final AtomicReference s3EventSerializer = new AtomicReference<>();
+
AWSTypesMessageConverter(JsonMapper jsonMapper) {
this(jsonMapper, new MimeType("application", "json"), new MimeType(CloudEventMessageUtils.APPLICATION_CLOUDEVENTS.getType(),
CloudEventMessageUtils.APPLICATION_CLOUDEVENTS.getSubtype() + "+json"));
@@ -75,7 +82,6 @@ class AWSTypesMessageConverter extends JsonMessageConverter {
if (message.getPayload().getClass().isAssignableFrom(targetClass)) {
return message.getPayload();
}
-
if (targetClass.getPackage() != null &&
targetClass.getPackage().getName().startsWith("com.amazonaws.services.lambda.runtime.events")) {
PojoSerializer> serializer = LambdaEventSerializers.serializerFor(targetClass, Thread.currentThread().getContextClassLoader());
@@ -110,12 +116,23 @@ class AWSTypesMessageConverter extends JsonMessageConverter {
}
+ @SuppressWarnings("unchecked")
@Override
protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers,
@Nullable Object conversionHint) {
if (payload instanceof String && headers.containsKey(AWSLambdaUtils.IS_BASE64_ENCODED) && (boolean) headers.get(AWSLambdaUtils.IS_BASE64_ENCODED)) {
return ((String) payload).getBytes(StandardCharsets.UTF_8);
}
+ if (payload.getClass().getName().equals("com.amazonaws.services.lambda.runtime.events.S3Event")) {
+ if (this.s3EventSerializer.get() == null) {
+ this.s3EventSerializer.set(new S3EventSerializer<>().withClassLoader(ClassUtils.getDefaultClassLoader()));
+ }
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ this.s3EventSerializer.get().toJson(payload, stream);
+ return stream.toByteArray();
+ }
+
+
return jsonMapper.toJson(payload);
}
diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java
index 917ca8693..0b55bc283 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java
+++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java
@@ -28,10 +28,14 @@ import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import com.amazonaws.services.lambda.runtime.ClientContext;
+import com.amazonaws.services.lambda.runtime.CognitoIdentity;
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.LambdaLogger;
+import com.amazonaws.services.lambda.runtime.LambdaRuntime;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-
import org.springframework.cloud.function.context.FunctionCatalog;
import org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry.FunctionInvocationWrapper;
import org.springframework.cloud.function.context.config.RoutingFunction;
@@ -130,6 +134,8 @@ public final class CustomRuntimeEventLoop implements SmartLifecycle {
logger.debug("Attempting to get new event");
ResponseEntity response = this.pollForData(rest, requestEntity);
+ Context clientContext = generateClientContext(response.getHeaders());
+
if (logger.isDebugEnabled()) {
logger.debug("New Event received: " + response);
}
@@ -140,9 +146,9 @@ public final class CustomRuntimeEventLoop implements SmartLifecycle {
FunctionInvocationWrapper function = locateFunction(environment, functionCatalog, response.getHeaders());
ByteArrayInputStream is = new ByteArrayInputStream(response.getBody().getBytes(StandardCharsets.UTF_8));
- Message> requestMessage = AWSLambdaUtils.generateMessage(is, function.getInputType(), function.isSupplier(), mapper, null);
-
+ Message> requestMessage = AWSLambdaUtils.generateMessage(is, function.getInputType(), function.isSupplier(), mapper, clientContext);
Object functionResponse = function.apply(requestMessage);
+
byte[] responseBytes = AWSLambdaUtils.generateOutputFromObject(requestMessage, functionResponse, mapper, function.getOutputType());
String invocationUrl = MessageFormat
@@ -157,12 +163,91 @@ public final class CustomRuntimeEventLoop implements SmartLifecycle {
}
}
catch (Exception e) {
+ e.printStackTrace();
this.propagateAwsError(requestId, e, mapper, runtimeApi, rest);
}
}
}
}
+ private Context generateClientContext(HttpHeaders headers) {
+
+ Map environment = System.getenv();
+
+ Context context = new Context() {
+
+ @Override
+ public int getRemainingTimeInMillis() {
+ long now = System.currentTimeMillis();
+ if (!headers.containsKey("Lambda-Runtime-Deadline-Ms")) {
+ return 0;
+ }
+ int delta = (int) (Long.parseLong(headers.getFirst("Lambda-Runtime-Deadline-Ms")) - now);
+ return delta > 0 ? delta : 0;
+ }
+
+ @Override
+ public int getMemoryLimitInMB() {
+ if (!environment.containsKey("AWS_LAMBDA_FUNCTION_MEMORY_SIZE")) {
+ return 128;
+ }
+ return Integer.parseInt(environment.getOrDefault("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "128"));
+ }
+
+ @Override
+ public LambdaLogger getLogger() {
+ return LambdaRuntime.getLogger();
+ }
+
+ @Override
+ public String getLogStreamName() {
+ return environment.get("LOG_STREAM_NAME");
+ }
+
+ @Override
+ public String getLogGroupName() {
+ return environment.get("LOG_GROUP_NAME");
+ }
+
+ @Override
+ public String getInvokedFunctionArn() {
+ return headers.getFirst("Lambda-Runtime-Invoked-Function-Arn");
+ }
+
+ @Override
+ public CognitoIdentity getIdentity() {
+ return null;
+ }
+
+ @Override
+ public String getFunctionVersion() {
+ return environment.get("FUNCTION_VERSION");
+ }
+
+ @Override
+ public String getFunctionName() {
+ return environment.get("FUNCTION_NAME");
+ }
+
+ @Override
+ public ClientContext getClientContext() {
+ return null;
+ }
+
+ @Override
+ public String getAwsRequestId() {
+ return headers.getFirst("Lambda-Runtime-Aws-Request-Id");
+ }
+
+ public String toString() {
+ return "FUNCTION NAME: " + getFunctionName() + ", FUNCTION VERSION: " + getFunctionVersion()
+ + ", FUNCTION ARN: " + getInvokedFunctionArn() + ", FUNCTION MEM LIMIT: " + getMemoryLimitInMB()
+ + ", FUNCTION DEADLINE: " + getRemainingTimeInMillis();
+ }
+ };
+ return context;
+ }
+
private void propagateAwsError(String requestId, Exception e, JsonMapper mapper, String runtimeApi, RestTemplate rest) {
String errorMessage = e.getMessage();
String errorType = e.getClass().getSimpleName();
diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java
index f1a5dd9b9..fb1bb9de3 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java
+++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java
@@ -999,6 +999,18 @@ public class FunctionInvokerTests {
assertThat(result).contains("s3SchemaVersion");
}
+ @Test
+ public void testS3EventAsOutput() throws Exception {
+ System.setProperty("MAIN_CLASS", S3Configuration.class.getName());
+ System.setProperty("spring.cloud.function.definition", "outputS3Event");
+ FunctionInvoker invoker = new FunctionInvoker();
+
+ InputStream targetStream = new ByteArrayInputStream(this.s3Event.getBytes());
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ invoker.handleRequest(targetStream, output, null);
+ assertThat(output.toByteArray()).isNotNull();
+ }
+
@Test
public void testS3Event() throws Exception {
System.setProperty("MAIN_CLASS", S3Configuration.class.getName());
@@ -1679,6 +1691,13 @@ public class FunctionInvokerTests {
@EnableAutoConfiguration
@Configuration
public static class S3Configuration {
+
+ @Bean
+ public Function outputS3Event() {
+ return v -> {
+ return v;
+ };
+ }
@Bean
public Function echoString() {
return v -> v;
diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/pom.xml
index 4888ab266..c04bef7e2 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/pom.xml
@@ -9,7 +9,7 @@
org.springframework.cloudspring-cloud-function-adapter-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTUTF-8
diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/pom.xml
index 36910303a..7085dffc4 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/pom.xml
@@ -12,7 +12,7 @@
org.springframework.cloudspring-cloud-function-adapter-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/pom.xml
index 13f43a1a4..17e3f3856 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/pom.xml
@@ -11,7 +11,7 @@
spring-cloud-function-adapter-parentorg.springframework.cloud
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/org.springframework.cloud.function.aws-lambda.packaging.gradle.plugin/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/org.springframework.cloud.function.aws-lambda.packaging.gradle.plugin/pom.xml
index 544fd3b70..2fc05ce87 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/org.springframework.cloud.function.aws-lambda.packaging.gradle.plugin/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/org.springframework.cloud.function.aws-lambda.packaging.gradle.plugin/pom.xml
@@ -10,7 +10,7 @@
org.springframework.cloud.function.aws-lambda.packagingspring-cloud-function-aws-gradle-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT${basedir}/../..
diff --git a/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/spring-cloud-function-aws-packaging-gradle-plugin/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/spring-cloud-function-aws-packaging-gradle-plugin/pom.xml
index 5bd9a6c39..8c376f8b8 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/spring-cloud-function-aws-packaging-gradle-plugin/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-aws-gradle-parent/spring-cloud-function-aws-packaging-gradle-plugin/pom.xml
@@ -13,7 +13,7 @@
org.springframework.cloud.function.aws-lambda.packagingspring-cloud-function-aws-gradle-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-adapters/spring-cloud-function-grpc-cloudevent-ext/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-grpc-cloudevent-ext/pom.xml
index 8c299de6b..2c4d85973 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-grpc-cloudevent-ext/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-grpc-cloudevent-ext/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloudspring-cloud-function-adapter-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTspring-cloud-function-grpc-cloudevent-extspring-cloud-function-grpc-cloudevent-ext
diff --git a/spring-cloud-function-adapters/spring-cloud-function-grpc/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-grpc/pom.xml
index 628d9a3f7..606145280 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-grpc/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-grpc/pom.xml
@@ -10,7 +10,7 @@
org.springframework.cloudspring-cloud-function-adapter-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.55.1
diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/pom.xml b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/pom.xml
index 5a9b820f4..cb74de9da 100644
--- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/pom.xml
+++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/pom.xml
@@ -10,7 +10,7 @@
org.springframework.cloudspring-cloud-function-adapter-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTUTF-8
@@ -59,7 +59,6 @@
spring-boot-starter-tomcat
- test
diff --git a/spring-cloud-function-context/pom.xml b/spring-cloud-function-context/pom.xml
index dd395dc28..0718852d3 100644
--- a/spring-cloud-function-context/pom.xml
+++ b/spring-cloud-function-context/pom.xml
@@ -12,7 +12,7 @@
org.springframework.cloudspring-cloud-function-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
@@ -65,6 +65,10 @@
com.fasterxml.jackson.datatypejackson-datatype-jsr310
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-joda
+ org.springframework.bootspring-boot-starter-test
diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/MessageRoutingCallback.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/MessageRoutingCallback.java
index 6f3b2a506..f9b2803ca 100644
--- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/MessageRoutingCallback.java
+++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/MessageRoutingCallback.java
@@ -21,21 +21,22 @@ import org.springframework.messaging.Message;
/**
* Java-based strategy to assist with determining the name of the route-to function definition.
- * Once implementation is registered as a bean in application context
+ * Once an implementation is registered as a bean in application context
* it will be picked up by the {@link RoutingFunction}.
- *
+ *
* While {@link RoutingFunction} provides several mechanisms to determine the route-to function definition
* this callback takes precedence over all of them.
*
* @author Oleg Zhurakousky
+ * @author John Blum
* @since 3.1
*/
public interface MessageRoutingCallback {
/**
- * Computes and returns the instance of {@link String} which encapsulates,
- * at the very minimum, function definition.
- *
+ * Computes and returns an instance of {@link String}, which encapsulates,
+ * at the very minimum, a function definition.
+ *
* Providing such message is primarily an optimization feature. It could be useful for cases
* where routing procedure is complex and results in, let's say, conversion of the payload to
* the target type, which would effectively be thrown away if the ability to modify the target
diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java
index b4ca09b95..5c672c159 100644
--- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java
+++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2019-2022 the original author or authors.
+ * Copyright 2019-2025 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.
@@ -63,6 +63,7 @@ import org.springframework.util.StringUtils;
*
* @author Oleg Zhurakousky
* @author Andrey Shlykov
+ * @author Artem Bilan
*
* @since 3.0
*/
@@ -382,6 +383,12 @@ public final class FunctionTypeUtils {
type = FunctionContextUtils.findType(applicationContext.getBeanFactory(), beanDefinitionName);
}
}
+ else if (type instanceof ParameterizedType) {
+ ResolvableType resolvableType = ResolvableType.forType(type);
+ if (FactoryBean.class.isAssignableFrom(resolvableType.toClass())) {
+ return resolvableType.getGeneric(0).getType();
+ }
+ }
return type;
}
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 80496d5cf..2fb21e056 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
@@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.google.gson.Gson;
import io.cloudevents.spring.messaging.CloudEventMessageConverter;
@@ -228,7 +229,7 @@ public class ContextFunctionCatalogAutoConfiguration {
mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
}
-
+ mapper.registerModule(new JodaModule());
if (KotlinDetector.isKotlinPresent()) {
try {
if (!mapper.getRegisteredModuleIds().contains("com.fasterxml.jackson.module.kotlin.KotlinModule")) {
diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java
index b15061df6..8aecd9500 100644
--- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java
+++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java
@@ -45,10 +45,11 @@ import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
- * An implementation of Function which acts as a gateway/router by actually
+ * An implementation of {@link Function} which acts as a gateway/router by actually
* delegating incoming invocation to a function specified .. .
*
* @author Oleg Zhurakousky
+ * @author John Blum
* @since 2.1
*
*/
@@ -127,8 +128,7 @@ public class RoutingFunction implements Function
-
+
+ com.amazonaws
+ aws-lambda-java-core
+ 1.1.0
+ org.springframework.bootspring-boot-starter-test
diff --git a/spring-cloud-function-samples/function-sample-aws-native/pom.xml b/spring-cloud-function-samples/function-sample-aws-native/pom.xml
index 7f2944ed6..6aa89fa42 100644
--- a/spring-cloud-function-samples/function-sample-aws-native/pom.xml
+++ b/spring-cloud-function-samples/function-sample-aws-native/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12oz.native.sample
@@ -15,7 +15,7 @@
Sample of AWS with Spring Native19
- 2023.0.4-SNAPSHOT
+ 2023.0.6-SNAPSHOT
@@ -47,7 +47,6 @@
com.amazonawsaws-lambda-java-core1.1.0
- provided
diff --git a/spring-cloud-function-samples/function-sample-aws-native/src/main/java/com/example/demo/NativeFunctionApplication.java b/spring-cloud-function-samples/function-sample-aws-native/src/main/java/com/example/demo/NativeFunctionApplication.java
index 5c544413a..399d786db 100644
--- a/spring-cloud-function-samples/function-sample-aws-native/src/main/java/com/example/demo/NativeFunctionApplication.java
+++ b/spring-cloud-function-samples/function-sample-aws-native/src/main/java/com/example/demo/NativeFunctionApplication.java
@@ -7,10 +7,14 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.function.adapter.aws.AWSLambdaUtils;
import org.springframework.context.annotation.Bean;
// import org.springframework.cloud.function.context.DefaultMessageRoutingHandler;
// import org.springframework.cloud.function.context.MessageRoutingCallback;
// import org.springframework.messaging.Message;
+import org.springframework.messaging.Message;
+
+import com.amazonaws.services.lambda.runtime.Context;
@SpringBootApplication
public class NativeFunctionApplication {
@@ -33,10 +37,11 @@ public class NativeFunctionApplication {
// }
@Bean
- public Function uppercase() {
- return v -> {
- System.out.println("Uppercasing " + v);
- return v.toUpperCase(Locale.ROOT);
+ public Function, String> uppercase() {
+ return message -> {
+ System.out.println("AWS Context: " + message.getHeaders().get(AWSLambdaUtils.AWS_CONTEXT));
+ System.out.println("Uppercasing " + message.getPayload());
+ return message.getPayload().toUpperCase(Locale.ROOT);
};
}
diff --git a/spring-cloud-function-samples/function-sample-aws-routing/pom.xml b/spring-cloud-function-samples/function-sample-aws-routing/pom.xml
index a2c9a4596..30111ba0e 100644
--- a/spring-cloud-function-samples/function-sample-aws-routing/pom.xml
+++ b/spring-cloud-function-samples/function-sample-aws-routing/pom.xml
@@ -15,7 +15,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
@@ -24,7 +24,7 @@
UTF-81.0.27.RELEASE2.0.2
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample-aws-serverless-web-native/pom.xml b/spring-cloud-function-samples/function-sample-aws-serverless-web-native/pom.xml
index 0767ab2b7..9ab0160ec 100644
--- a/spring-cloud-function-samples/function-sample-aws-serverless-web-native/pom.xml
+++ b/spring-cloud-function-samples/function-sample-aws-serverless-web-native/pom.xml
@@ -6,7 +6,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12oz.native.sample
@@ -16,7 +16,7 @@
Sample of AWS with Spring Native21
- 2023.0.4-SNAPSHOT
+ 2023.0.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample-aws/pom.xml b/spring-cloud-function-samples/function-sample-aws/pom.xml
index 7dea715dd..ea2fbb729 100644
--- a/spring-cloud-function-samples/function-sample-aws/pom.xml
+++ b/spring-cloud-function-samples/function-sample-aws/pom.xml
@@ -15,7 +15,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
@@ -24,7 +24,7 @@
UTF-81.0.29.RELEASE3.9.0
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample-azure-blob-trigger/pom.xml b/spring-cloud-function-samples/function-sample-azure-blob-trigger/pom.xml
index a1d9d38c0..c518527f6 100644
--- a/spring-cloud-function-samples/function-sample-azure-blob-trigger/pom.xml
+++ b/spring-cloud-function-samples/function-sample-azure-blob-trigger/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-azure-http-trigger/pom.xml b/spring-cloud-function-samples/function-sample-azure-http-trigger/pom.xml
index c1848b28d..dbeb170a2 100644
--- a/spring-cloud-function-samples/function-sample-azure-http-trigger/pom.xml
+++ b/spring-cloud-function-samples/function-sample-azure-http-trigger/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-azure-kafka-trigger/pom.xml b/spring-cloud-function-samples/function-sample-azure-kafka-trigger/pom.xml
index f3863218d..e0f33a40d 100644
--- a/spring-cloud-function-samples/function-sample-azure-kafka-trigger/pom.xml
+++ b/spring-cloud-function-samples/function-sample-azure-kafka-trigger/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-azure-time-trigger/pom.xml b/spring-cloud-function-samples/function-sample-azure-time-trigger/pom.xml
index 29a656e35..29e01a347 100644
--- a/spring-cloud-function-samples/function-sample-azure-time-trigger/pom.xml
+++ b/spring-cloud-function-samples/function-sample-azure-time-trigger/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-azure-web/pom.xml b/spring-cloud-function-samples/function-sample-azure-web/pom.xml
index 84e01a3c1..5e4f90674 100644
--- a/spring-cloud-function-samples/function-sample-azure-web/pom.xml
+++ b/spring-cloud-function-samples/function-sample-azure-web/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-azure/pom.xml b/spring-cloud-function-samples/function-sample-azure/pom.xml
index 79b9ddc43..05773fee9 100644
--- a/spring-cloud-function-samples/function-sample-azure/pom.xml
+++ b/spring-cloud-function-samples/function-sample-azure/pom.xml
@@ -14,7 +14,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-cloudevent-rsocket/pom.xml b/spring-cloud-function-samples/function-sample-cloudevent-rsocket/pom.xml
index 533ee307e..bc3009ec2 100644
--- a/spring-cloud-function-samples/function-sample-cloudevent-rsocket/pom.xml
+++ b/spring-cloud-function-samples/function-sample-cloudevent-rsocket/pom.xml
@@ -11,12 +11,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.0.27.RELEASE
diff --git a/spring-cloud-function-samples/function-sample-cloudevent-sdk/pom.xml b/spring-cloud-function-samples/function-sample-cloudevent-sdk/pom.xml
index f6e9d5dbe..834c7bc5b 100644
--- a/spring-cloud-function-samples/function-sample-cloudevent-sdk/pom.xml
+++ b/spring-cloud-function-samples/function-sample-cloudevent-sdk/pom.xml
@@ -11,12 +11,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.0.27.RELEASE
diff --git a/spring-cloud-function-samples/function-sample-cloudevent-stream/pom.xml b/spring-cloud-function-samples/function-sample-cloudevent-stream/pom.xml
index ed3dfd9eb..a4f4134b5 100644
--- a/spring-cloud-function-samples/function-sample-cloudevent-stream/pom.xml
+++ b/spring-cloud-function-samples/function-sample-cloudevent-stream/pom.xml
@@ -11,12 +11,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.0.27.RELEASE
diff --git a/spring-cloud-function-samples/function-sample-cloudevent/pom.xml b/spring-cloud-function-samples/function-sample-cloudevent/pom.xml
index 21d0c704d..b916c2d47 100644
--- a/spring-cloud-function-samples/function-sample-cloudevent/pom.xml
+++ b/spring-cloud-function-samples/function-sample-cloudevent/pom.xml
@@ -11,12 +11,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.0.27.RELEASE
diff --git a/spring-cloud-function-samples/function-sample-functional-aws-routing/pom.xml b/spring-cloud-function-samples/function-sample-functional-aws-routing/pom.xml
index 230028d8b..07d1012c7 100644
--- a/spring-cloud-function-samples/function-sample-functional-aws-routing/pom.xml
+++ b/spring-cloud-function-samples/function-sample-functional-aws-routing/pom.xml
@@ -15,7 +15,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
@@ -24,7 +24,7 @@
UTF-81.0.27.RELEASE2.0.2
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample-gcp-background/pom.xml b/spring-cloud-function-samples/function-sample-gcp-background/pom.xml
index 35d41d8fd..5ff2b7546 100644
--- a/spring-cloud-function-samples/function-sample-gcp-background/pom.xml
+++ b/spring-cloud-function-samples/function-sample-gcp-background/pom.xml
@@ -15,7 +15,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-gcp-http/pom.xml b/spring-cloud-function-samples/function-sample-gcp-http/pom.xml
index bc1668676..97b41ae77 100644
--- a/spring-cloud-function-samples/function-sample-gcp-http/pom.xml
+++ b/spring-cloud-function-samples/function-sample-gcp-http/pom.xml
@@ -15,12 +15,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample-grpc-cloudevent/pom.xml b/spring-cloud-function-samples/function-sample-grpc-cloudevent/pom.xml
index b9c1bc157..3e23cde98 100644
--- a/spring-cloud-function-samples/function-sample-grpc-cloudevent/pom.xml
+++ b/spring-cloud-function-samples/function-sample-grpc-cloudevent/pom.xml
@@ -7,7 +7,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12com.example.grpc
@@ -16,7 +16,7 @@
function-sample-grpc-cloudeventDemo project for Spring Boot
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.55.1
diff --git a/spring-cloud-function-samples/function-sample-kotlin-web/pom.xml b/spring-cloud-function-samples/function-sample-kotlin-web/pom.xml
index 857418de3..d4d50ceba 100644
--- a/spring-cloud-function-samples/function-sample-kotlin-web/pom.xml
+++ b/spring-cloud-function-samples/function-sample-kotlin-web/pom.xml
@@ -11,7 +11,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
diff --git a/spring-cloud-function-samples/function-sample-pof/pom.xml b/spring-cloud-function-samples/function-sample-pof/pom.xml
index bbc6c497c..47710a9fb 100644
--- a/spring-cloud-function-samples/function-sample-pof/pom.xml
+++ b/spring-cloud-function-samples/function-sample-pof/pom.xml
@@ -13,7 +13,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
@@ -21,7 +21,7 @@
UTF-8UTF-83.1.2.RELEASE
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample-pojo/pom.xml b/spring-cloud-function-samples/function-sample-pojo/pom.xml
index 991103777..10228eece 100644
--- a/spring-cloud-function-samples/function-sample-pojo/pom.xml
+++ b/spring-cloud-function-samples/function-sample-pojo/pom.xml
@@ -14,12 +14,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.0.27.RELEASE
diff --git a/spring-cloud-function-samples/function-sample-spring-integration/pom.xml b/spring-cloud-function-samples/function-sample-spring-integration/pom.xml
index 36e330401..d039b0824 100644
--- a/spring-cloud-function-samples/function-sample-spring-integration/pom.xml
+++ b/spring-cloud-function-samples/function-sample-spring-integration/pom.xml
@@ -12,7 +12,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
@@ -20,7 +20,7 @@
UTF-8UTF-817
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml b/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml
index c7b538be5..f3d0dbd03 100644
--- a/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml
+++ b/spring-cloud-function-samples/function-sample-supplier-exporter/pom.xml
@@ -14,12 +14,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/function-sample/pom.xml b/spring-cloud-function-samples/function-sample/pom.xml
index c7c18583f..7d007403d 100644
--- a/spring-cloud-function-samples/function-sample/pom.xml
+++ b/spring-cloud-function-samples/function-sample/pom.xml
@@ -14,12 +14,12 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT1.0.27.RELEASE
diff --git a/spring-cloud-function-samples/pom.xml b/spring-cloud-function-samples/pom.xml
index 0fb10f9aa..d7b1ac765 100644
--- a/spring-cloud-function-samples/pom.xml
+++ b/spring-cloud-function-samples/pom.xml
@@ -11,7 +11,7 @@
org.springframework.cloudspring-cloud-function-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-function-samples/scf-aws-day1/pom.xml b/spring-cloud-function-samples/scf-aws-day1/pom.xml
index ebb0d63a8..85799d12b 100644
--- a/spring-cloud-function-samples/scf-aws-day1/pom.xml
+++ b/spring-cloud-function-samples/scf-aws-day1/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12oz.spring
@@ -15,7 +15,7 @@
Template project for creating function that can be deployed as AWS Lambda17
- 2023.0.4-SNAPSHOT
+ 2023.0.6-SNAPSHOT1.0.31.RELEASE3.9.01.1.0
diff --git a/spring-cloud-function-samples/scf-aws-routing/pom.xml b/spring-cloud-function-samples/scf-aws-routing/pom.xml
index 6144c67f1..d6993f18a 100644
--- a/spring-cloud-function-samples/scf-aws-routing/pom.xml
+++ b/spring-cloud-function-samples/scf-aws-routing/pom.xml
@@ -5,7 +5,7 @@
org.springframework.bootspring-boot-starter-parent
- 3.2.12-SNAPSHOT
+ 3.2.12oz.spring
@@ -15,7 +15,7 @@
Template project for creating function that can be deployed as AWS Lambda17
- 2023.0.4-SNAPSHOT
+ 2023.0.6-SNAPSHOT1.0.31.RELEASE3.9.01.1.0
diff --git a/spring-cloud-function-web/pom.xml b/spring-cloud-function-web/pom.xml
index 87d7b8a61..f041e77e3 100644
--- a/spring-cloud-function-web/pom.xml
+++ b/spring-cloud-function-web/pom.xml
@@ -12,7 +12,7 @@
org.springframework.cloudspring-cloud-function-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT
diff --git a/spring-cloud-starter-function-web/pom.xml b/spring-cloud-starter-function-web/pom.xml
index c91db1633..7eb84ae89 100644
--- a/spring-cloud-starter-function-web/pom.xml
+++ b/spring-cloud-starter-function-web/pom.xml
@@ -6,7 +6,7 @@
org.springframework.cloudspring-cloud-function-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOT..spring-cloud-starter-function-web
diff --git a/spring-cloud-starter-function-webflux/pom.xml b/spring-cloud-starter-function-webflux/pom.xml
index c5e4c29d6..4896c6a0a 100644
--- a/spring-cloud-starter-function-webflux/pom.xml
+++ b/spring-cloud-starter-function-webflux/pom.xml
@@ -6,7 +6,7 @@
org.springframework.cloudspring-cloud-function-parent
- 4.1.4-SNAPSHOT
+ 4.1.6-SNAPSHOTspring-cloud-starter-function-webfluxspring-cloud-starter-function-webflux