NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null

一、问题描述

今天服务升级了一个版本,在发送rabbitmq消息时报错NPE

java.lang.NullPointerException: Cannot invoke “org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.setSkipOutputConversion(boolean)” because “functionToInvoke” is null
at org.springframework.cloud.stream.function.StreamBridge.getStreamBridgeFunction(StreamBridge.java:215)
at org.springframework.cloud.stream.function.StreamBridge.send(StreamBridge.java:170)

二、问题排查

根据报错,可以知道是 functionToInvoke 为空,看 StreamBridge 源码(项目用的是Spring Cloud Stream)

image-20250109155751433

跟进 functionCatalog.lookup 方法,一直往下,来到 BeanFactoryAwareFunctionRegistrylookup 方法

image-20250109160037754

发现是满足 !isFunctionDefinitionEligible(functionDefinition) 条件返回的 null,那就说明 isFunctionDefinitionEligible 方法返回了 false,debug 进去看

image-20250109160230370

发现 definition 竟然包含了一个空字符串,然后开始寻找 this.functionProperties.getIneligibleDefinitions() 的由来,很显然这个是在项目启动的时候塞值的,于是在 FunctionProperties 类的 setIneligibleDefinitions 方法上打上断点,重启项目

image-20250109160537504

发现确实塞了个空字符串,于是顺着往上找

image-20250109160818241

发现是 kafka 相关的东西,sendToDlqAndContinuekafka 的东西,但是为什么后面拼了一个逗号,不能理解,于是又找在哪里添加这个逗号的,然后在 KafkaStreamsBinderEnvironmentPostProcessor 里找到了代码

image-20250109161038530

所以这个空字符串,是在 environment.getProperty(ineligibleDefinitionsPropertyKey) 里获取的,于是在 MutablePropertySources 类的所有添加方法上打上断点重来

image-20250109161727837

最后在 addLast 方法里找到了,发现是微软云的 AzurePasswordlessEnvironmentPostProcessor 类中设置的

image-20250109161812420

然后这段代码看着就很迷惑,创建一个空列表,然后用 String.join ,这么干的意义是什么???

然后就去github看,发现这个问题在3周前修复了

Fix bug: Registered the empty value for ineligible definition, it causes NPE when sending message via bean StreamBridge (#43490)

呃……这个文件直接被删了

三、解决问题

由于微软云解决问题的版本还是beta版本,暂时没考虑升级来解决问题

在配置文件里加上如下配置来解决

spring:
	cloud:
		function:
			ineligible-definitions: xxxxx

xxxxx可以是任意字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿点点的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值