diff --git a/spring-cloud-function-deployer/pom.xml b/spring-cloud-function-deployer/pom.xml
index 044618b53..dccb0937b 100644
--- a/spring-cloud-function-deployer/pom.xml
+++ b/spring-cloud-function-deployer/pom.xml
@@ -30,6 +30,11 @@
spring-cloud-function-web
${project.version}
+
+ org.springframework.cloud
+ spring-cloud-function-stream
+ ${project.version}
+
org.springframework.boot
spring-boot-configuration-processor
diff --git a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java
index 4180c6e31..0eaef5e5a 100644
--- a/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java
+++ b/spring-cloud-function-deployer/src/main/java/org/springframework/cloud/function/deployer/ApplicationRunner.java
@@ -45,6 +45,8 @@ import org.springframework.boot.loader.thin.ArchiveUtils;
import org.springframework.cloud.deployer.thin.ContextRunner;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.core.SpringVersion;
+import org.springframework.messaging.Message;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
@@ -60,6 +62,8 @@ public class ApplicationRunner implements CommandLineRunner {
private static final String DEFAULT_REACTOR_VERSION = "3.0.4.RELEASE";
+ private static final String DEFAULT_SPRING_VERSION = SpringVersion.getVersion();
+
private static Log logger = LogFactory.getLog(ApplicationRunner.class);
public static void main(String[] args) {
@@ -125,14 +129,18 @@ public class ApplicationRunner implements CommandLineRunner {
for (URL url : urls) {
child.add(url);
}
- String reactor = getReactorCoordinates();
DependencyResolutionContext context = new DependencyResolutionContext();
AetherEngine engine = AetherEngine.create(
RepositoryConfigurationFactory.createDefaultRepositoryConfiguration(),
context);
+ String reactor = getReactorCoordinates();
+ // spring-core is OK, spring-context is not, spring-messaging depends on
+ // spring-context (so it is not OK)
+ String spring = getSpringCoordinates();
try {
- List resolved = engine.resolve(Arrays
- .asList(new Dependency(new DefaultArtifact(reactor), "runtime")));
+ List resolved = engine.resolve(
+ Arrays.asList(new Dependency(new DefaultArtifact(reactor), "runtime"),
+ new Dependency(new DefaultArtifact(spring), "runtime")));
for (File archive : resolved) {
try {
URL url = archive.toURI().toURL();
@@ -155,6 +163,13 @@ public class ApplicationRunner implements CommandLineRunner {
return new URLClassLoader(child.toArray(new URL[0]), base);
}
+ private String getSpringCoordinates() {
+ Package pkg = Message.class.getPackage();
+ String version = null;
+ version = (pkg != null ? pkg.getImplementationVersion() : DEFAULT_SPRING_VERSION);
+ return "org.springframework:spring-core:" + version;
+ }
+
private String getReactorCoordinates() {
Package pkg = Flux.class.getPackage();
String version = null;
diff --git a/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/FunctionExtractingFunctionCatalogIntegrationTests.java b/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/FunctionExtractingFunctionCatalogIntegrationTests.java
index fa466870a..d906f4f50 100644
--- a/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/FunctionExtractingFunctionCatalogIntegrationTests.java
+++ b/spring-cloud-function-deployer/src/test/java/org/springframework/cloud/function/deployer/FunctionExtractingFunctionCatalogIntegrationTests.java
@@ -38,7 +38,8 @@ public class FunctionExtractingFunctionCatalogIntegrationTests {
public static void open() {
port = SocketUtils.findAvailableTcpPort();
// System.setProperty("debug", "true");
- context = new ApplicationRunner().start("--server.port=" + port);
+ context = new ApplicationRunner().start("--server.port=" + port,
+ "--spring.cloud.stream.enabled=false");
}
@AfterClass
diff --git a/spring-cloud-function-stream/src/main/java/org/springframework/cloud/function/stream/StreamConfiguration.java b/spring-cloud-function-stream/src/main/java/org/springframework/cloud/function/stream/StreamConfiguration.java
index bf1486bb9..eaf70789c 100644
--- a/spring-cloud-function-stream/src/main/java/org/springframework/cloud/function/stream/StreamConfiguration.java
+++ b/spring-cloud-function-stream/src/main/java/org/springframework/cloud/function/stream/StreamConfiguration.java
@@ -38,6 +38,7 @@ import reactor.core.publisher.Flux;
@EnableBinding(Processor.class)
@EnableConfigurationProperties(FunctionConfigurationProperties.class)
@ConditionalOnClass({ Binder.class, AbstractFunctionInvoker.class })
+@ConditionalOnProperty(name = "spring.cloud.stream.enabled", havingValue = "true", matchIfMissing = true)
public class StreamConfiguration {
@Autowired
diff --git a/spring-cloud-function-web/pom.xml b/spring-cloud-function-web/pom.xml
index a31e42065..c68184059 100644
--- a/spring-cloud-function-web/pom.xml
+++ b/spring-cloud-function-web/pom.xml
@@ -28,6 +28,16 @@
spring-cloud-function-core
${project.version}
+
+ org.springframework.cloud
+ spring-cloud-function-context
+ ${project.version}
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionController.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionController.java
index 2545b7955..1158fd05f 100644
--- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionController.java
+++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/FunctionController.java
@@ -18,10 +18,10 @@ package org.springframework.cloud.function.web;
import java.util.function.Function;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.embedded.ReactiveServerProperties;
import org.springframework.cloud.function.registry.FunctionCatalog;
-import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -38,6 +38,9 @@ import reactor.core.publisher.Flux;
@ConditionalOnClass({ RestController.class, ReactiveServerProperties.class })
public class FunctionController {
+ @Value("${debug:${DEBUG:false}}")
+ private boolean debug = false;
+
private final FunctionCatalog functions;
@Autowired
@@ -45,7 +48,7 @@ public class FunctionController {
this.functions = catalog;
}
- @PostMapping(path = "/{name}", consumes = MediaType.TEXT_PLAIN_VALUE)
+ @PostMapping(path = "/{name}")
public Flux function(@PathVariable String name,
@RequestBody Flux body) {
Function