GH-106: Fix SplitterFunctionConfiguration for ambiguity on auto-wiring

Fixes: https://github.com/spring-cloud/spring-functions-catalog/issues/106

The `AbstractMessageSplitter messageSplitter` injection is too wide,
and if target application has its own splitter bean, it becomes as a candidate.
Since `SplitterFunctionConfiguration` expects only its own beans, rework the logic for `@Qualifier`
and `Optional` to be explicit for expected beans from the `SplitterFunctionConfiguration`.
This commit is contained in:
Artem Bilan
2024-12-06 13:22:59 -05:00
parent 3f041a9399
commit 58ffb22fff

View File

@@ -18,11 +18,13 @@ package org.springframework.cloud.fn.splitter;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -49,9 +51,15 @@ import org.springframework.messaging.MessageChannel;
public class SplitterFunctionConfiguration {
@Bean
public Function<Message<?>, List<Message<?>>> splitterFunction(AbstractMessageSplitter messageSplitter,
public Function<Message<?>, List<Message<?>>> splitterFunction(
@Qualifier("expressionSplitter") Optional<AbstractMessageSplitter> expressionSplitter,
@Qualifier("fileSplitter") Optional<AbstractMessageSplitter> fileSplitter,
@Qualifier("defaultSplitter") Optional<AbstractMessageSplitter> defaultSplitter,
SplitterFunctionProperties splitterFunctionProperties) {
AbstractMessageSplitter messageSplitter = expressionSplitter.or(() -> fileSplitter)
.or(() -> defaultSplitter)
.get();
messageSplitter.setApplySequence(splitterFunctionProperties.isApplySequence());
ThreadLocalFluxSinkMessageChannel outputChannel = new ThreadLocalFluxSinkMessageChannel();
messageSplitter.setOutputChannel(outputChannel);