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
相关产品推荐
相关产品推荐

