* Add meaningful exception when no function definition in catalog

This commit is contained in:
abilan
2023-05-18 13:47:29 -04:00
committed by Oleg Zhurakousky
parent 42a5319c99
commit d0b0d9210d
2 changed files with 33 additions and 2 deletions

View File

@@ -23,6 +23,7 @@ import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.springframework.cloud.function.context.FunctionCatalog; import org.springframework.cloud.function.context.FunctionCatalog;
import org.springframework.util.Assert;
/** /**
* The helper class to lookup functions from the catalog in lazy manner and cache their instances. * The helper class to lookup functions from the catalog in lazy manner and cache their instances.
@@ -55,7 +56,13 @@ public class FunctionLookupHelper {
} }
private <T> Supplier<T> lazyLookup(Class<?> functionType, String functionDefinition) { private <T> Supplier<T> lazyLookup(Class<?> functionType, String functionDefinition) {
return memoize(() -> this.functionCatalog.lookup(functionType, functionDefinition)); return memoize(() -> requireNonNull(functionType, functionDefinition));
}
private <T> T requireNonNull(Class<?> functionType, String functionDefinition) {
T function = this.functionCatalog.lookup(functionType, functionDefinition);
Assert.notNull(function, () -> "No '" + functionDefinition + "' in the catalog");
return function;
} }
/** /**
@@ -72,7 +79,7 @@ public class FunctionLookupHelper {
synchronized (value) { synchronized (value) {
val = value.get(); val = value.get();
if (val == null) { if (val == null) {
val = Objects.requireNonNull(delegate.get()); val = delegate.get();
value.set(val); value.set(val);
} }
} }

View File

@@ -36,16 +36,19 @@ import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.PollerSpec; import org.springframework.integration.dsl.PollerSpec;
import org.springframework.integration.dsl.Pollers; import org.springframework.integration.dsl.Pollers;
import org.springframework.integration.dsl.context.IntegrationFlowContext;
import org.springframework.integration.endpoint.SourcePollingChannelAdapter; import org.springframework.integration.endpoint.SourcePollingChannelAdapter;
import org.springframework.integration.handler.LoggingHandler; import org.springframework.integration.handler.LoggingHandler;
import org.springframework.integration.scheduling.PollerMetadata; import org.springframework.integration.scheduling.PollerMetadata;
import org.springframework.integration.test.util.OnlyOnceTrigger; import org.springframework.integration.test.util.OnlyOnceTrigger;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageDeliveryException;
import org.springframework.messaging.support.GenericMessage; import org.springframework.messaging.support.GenericMessage;
import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
/** /**
@@ -98,6 +101,27 @@ public class FunctionFlowTests {
verify(this.functionCatalog).lookup(Consumer.class, "upperCaseFunction|simpleStringConsumer"); verify(this.functionCatalog).lookup(Consumer.class, "upperCaseFunction|simpleStringConsumer");
} }
@Test
void noFunctionInCatalogException(@Autowired FunctionFlowBuilder functionFlowBuilder,
@Autowired IntegrationFlowContext integrationFlowContext) {
IntegrationFlow wrongFlow =
functionFlowBuilder.from("inputChannel")
.accept("nonExistingConsumer");
IntegrationFlowContext.IntegrationFlowRegistration registration =
integrationFlowContext.registration(wrongFlow)
.register();
assertThatExceptionOfType(MessageDeliveryException.class)
.isThrownBy(() -> registration.getInputChannel().send(new GenericMessage<>("test")))
.withRootCauseInstanceOf(IllegalArgumentException.class)
.withStackTraceContaining("No 'nonExistingConsumer' in the catalog");
registration.destroy();
}
@EnableAutoConfiguration @EnableAutoConfiguration
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
static class TestIntegrationConfiguration { static class TestIntegrationConfiguration {