diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java index 19efff75c..b2b9e886b 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java @@ -32,6 +32,7 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.cloud.function.context.FunctionCatalog; @@ -110,6 +111,14 @@ public class BeanFactoryAwareFunctionRegistry extends SimpleFunctionRegistry imp @Override Object locateFunction(String name) { Object function = super.locateFunction(name); + if (function == null) { + try { + function = BeanFactoryAnnotationUtils.qualifiedBeanOfType(this.applicationContext.getBeanFactory(), Object.class, name); + } + catch (Exception e) { + // ignore + } + } if (function == null && this.applicationContext.containsBean(name)) { function = this.applicationContext.getBean(name); } diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java index f6b58f4ba..f4b2fba17 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java @@ -200,7 +200,10 @@ public class RequestProcessor { } if (result instanceof Flux) { - result = Flux.from(result).collectList(); + result = Flux.from(result).onErrorContinue((e, v) -> { + logger.error("Failed to process value: " + v, e); + }) + .collectList(); } return Mono.from(result).flatMap(body -> Mono.just(builder.body(body))); } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/scan/ComponentTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/scan/ComponentTests.java index d2ea7a276..004aab86c 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/scan/ComponentTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/scan/ComponentTests.java @@ -19,7 +19,6 @@ package org.springframework.cloud.function.scan; import java.net.URI; import java.util.function.Function; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import reactor.core.publisher.Flux; @@ -63,7 +62,6 @@ public class ComponentTests { } @Test - @Ignore("FIXME") public void greeter() throws Exception { ResponseEntity result = this.rest .exchange( @@ -71,7 +69,7 @@ public class ComponentTests { .contentType(MediaType.TEXT_PLAIN).body("World"), String.class); assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(result.getBody()).isEqualTo("Hello World"); + assertThat(result.getBody()).isEqualTo("[\"Hello World\"]"); } @SpringBootApplication diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/MoreThenOneFunctionRootMappingTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/MoreThenOneFunctionRootMappingTests.java index 10a73b775..14b14e4a7 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/MoreThenOneFunctionRootMappingTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/test/MoreThenOneFunctionRootMappingTests.java @@ -18,7 +18,6 @@ package org.springframework.cloud.function.test; import java.util.function.Function; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import reactor.core.publisher.Mono; @@ -49,8 +48,6 @@ public class MoreThenOneFunctionRootMappingTests { private WebTestClient client; @Test - @Ignore // Effectively this is an invalid test, since it assumes the order of function composition which is wrong - // uppercase|reverse or reverse|uppercase? public void words() throws Exception { this.client.post().uri("/").body(Mono.just("star"), String.class).exchange() .expectStatus().isOk().expectBody(String.class).isEqualTo("RATS"); diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java index a4505c7db..65b951c5f 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -28,7 +28,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import reactor.core.publisher.Flux; @@ -101,7 +100,6 @@ public class HttpGetIntegrationTests { } @Test - @Ignore("Fix error handling") public void errorJson() throws Exception { assertThat(this.rest .exchange(RequestEntity.get(new URI("/bang")) diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java index e44a14dec..dde2e563f 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java @@ -85,7 +85,6 @@ public class HttpPostIntegrationTests { } @Test - @Ignore public void qualifierFoos() throws Exception { ResponseEntity result = this.rest.exchange(RequestEntity .post(new URI("/foos")).contentType(MediaType.APPLICATION_JSON) @@ -220,7 +219,6 @@ public class HttpPostIntegrationTests { } @Test - @Ignore public void typelessFunctionPassingArray() throws Exception { ResponseEntity result = this.rest.exchange( RequestEntity.post(new URI("/typelessFunctionExpectingText"))