Создание bean-компонента RoutingFunction в последней версии Spring Boot и Spring Cloud.
В моем проекте я использовал функцию весеннего облака. Мы использовали Spring Boot версии 2.6.6 и Spring-cloud-function-context версии 3.2.3 вместе с другими необходимыми зависимостями. При этом я использовал RoutingFunction (org.springframework.cloud.function.context.config) для пользовательской маршрутизации. . Я не создавал ни одного bean-компонента для RoutingFunction, и он работал нормально.
@Component
@Slf4j
public class FxRouter<T> implements UnaryOperator<Message<T>> {
private RoutingFunction routingFunction;
@Autowired
public FxRouter(RoutingFunction routingFunction) {
this.routingFunction = routingFunction;
}
@Override
public Message<T> apply(Message<T> object) {
log.debug("In FxRouter, received object : {}", object);
String springCloudFunctions = System.getenv(Constants.SPRING_CLOUD_FUNCTION_ORDER);
log.debug("Execution sequence order : {}", springCloudFunctions);
if (DMUtil.isNotBlank(springCloudFunctions)) {
return startRouting(object,springCloudFunctions);
} else {
log.error("No Spring Cloud Function Order Property provided in Environment variable");
return null;
}
}
private Message<T> startRouting(Message<T> object,String springCloudFunctions) {
log.debug("In FxRouter-startRouting, received object for routing : {}", object);
T incomingAWSEvent = object.getPayload();
List<String> functions =
Arrays.asList(springCloudFunctions.split(Pattern.quote(Constants.FUNCTION_PIPE)));
Iterator<String> functionsItr = functions.iterator();
while (functionsItr.hasNext()) {
String function = functionsItr.next();
try {
Message<T> functionMessage = MessageBuilder
.withPayload(object.getPayload())
.setHeader(Constants.SPRING_CLOUD_FUNCTION_DEFINITION, function)
.setHeader(MessageHeaders.CONTENT_TYPE, Constants.CONTENT_TYPE_TEXT_PLAIN)
.copyHeadersIfAbsent(object.getHeaders())
.build();
log.debug("Routing to function: {} ", function);
Object payload = routingFunction.apply(functionMessage);
object = getPayloadMessage(object, payload);
if (!functionsItr.hasNext()) {
return object;
}
} catch (CustomRuntimeException e) {
Message<CustomRuntimeException> errorMessage = MessageBuilder
.withPayload(e)
.setHeader(Constants.SPRING_CLOUD_FUNCTION_DEFINITION, Constants.LOGGER_FUNCTION)
.build();
Message<T> message = routeToErrorHandlerOrReturnResponse(incomingAWSEvent, e, errorMessage);
if (message != null) {
return message;
}
break;
}
}
return null;
}
Недавно я обновил версию весенней загрузки до 3.1.2 и использую версию зависимости Spring Cloud ниже.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-aws</artifactId>
</dependency>
Сейчас после обновления до последней версии. Я не могу выполнить автоматическое подключение RoutingFunction, потому что оно говорит: « Не удалось выполнить автоматическое подключение». Компоненты типа RoutingFunction не найдены . Поэтому я пытаюсь создать компонент для RoutingFunction, как показано ниже.
@Configuration(proxyBeanMethods = false)
public class RouterConfig {
@Bean
public RoutingFunction routingFunction() {
return new RoutingFunction(null,null);
}
}
Но тогда я получаю ошибку во время выполнения
"stackTrace": "java.lang.NullPointerException\n\tat org.springframework.cloud.function.context.config.RoutingFunction.resolveFunction(RoutingFunction.java:237)\n\tat org.springframework.cloud.function.context.config.RoutingFunction.functionFromDefinition(RoutingFunction.java:206)\n\tat org.springframework.cloud.function.context.config.RoutingFunction.route(RoutingFunction.java:137)\n\tat org.springframework.cloud.function.context.config.RoutingFunction.apply(RoutingFunction.java:107)\n\tat
Может ли кто-нибудь помочь мне, как создать bean-компонент для RoutingFunction?