You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.1.2与Spring Cloud新版本中RoutingFunction Bean创建问题

Spring Cloud Function升级后RoutingFunction无法自动注入的解决方案

问题描述

此前使用Spring Boot 2.6.6 + spring-cloud-function-context 3.2.3时,无需手动创建RoutingFunction(org.springframework.cloud.function.context.config)Bean即可自动注入,自定义路由功能运行正常。相关路由代码如下:

@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;
  }
}

将Spring Boot版本升级至3.1.2,并使用Spring Cloud 2022.0.4依赖后:

<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>

出现Could not autowire. No beans of 'RoutingFunction' type found错误。尝试手动创建Bean时传入null参数:

@Configuration(proxyBeanMethods = false)
public class RouterConfig {

  @Bean
  public RoutingFunction routingFunction() {
    return new RoutingFunction(null,null);
  }
}

运行时触发空指针异常:

"stackTrace": "java.lang.NullPointerException
	at org.springframework.cloud.function.context.config.RoutingFunction.resolveFunction(RoutingFunction.java:237)
	at org.springframework.cloud.function.context.config.RoutingFunction.functionFromDefinition(RoutingFunction.java:206)
	at org.springframework.cloud.function.context.config.RoutingFunction.route(RoutingFunction.java:137)
	at org.springframework.cloud.function.context.config.RoutingFunction.apply(RoutingFunction.java:107)
	at 

解决方案

RoutingFunction的构造需要依赖FunctionRegistry和FunctionCatalog两个核心Bean,不能传入null。正确的Bean配置方式是注入这两个依赖后构造实例:

@Configuration(proxyBeanMethods = false)
public class RouterConfig {

    @Bean
    public RoutingFunction routingFunction(FunctionRegistry functionRegistry, FunctionCatalog functionCatalog) {
        return new RoutingFunction(functionRegistry, functionCatalog);
    }
}

原因说明

在旧版本的Spring Cloud Function中,框架会自动注册RoutingFunction的Bean并注入所需依赖。但升级到Spring Cloud 2022.0.4(对应Spring Boot 3.x)后,该自动配置逻辑发生变化,需要手动显式创建RoutingFunctionBean,并确保注入其依赖的FunctionRegistry和FunctionCatalog,这两个Bean由Spring Cloud Function上下文自动提供,无需手动创建。

内容的提问来源于stack exchange,提问作者Mohit Sardiwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:25:31