博客
关于我
NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
阅读量:797 次
发布时间:2023-02-17

本文共 1734 字,大约阅读时间需要 5 分钟。

今天服务升级了一个版本,在发送RabbitMQ消息时遇到了 NullPointerException。错误信息提示“java.lang.NullPointerException: Cannot invoke 'org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.setSkipOutputConversion(boolean)' because 'functionToInvoke' is null”。错误发生在StreamBridge.send方法中,具体是在StreamBridge.getStreamBridgeFunction方法中调用setSkipOutputConversion时。

首先,分析错误信息,发现问题出在functionToInvoke变量未被赋值,导致为null。调用栈显示,问题来源于SimpleFunctionRegistry$FunctionInvocationWrapper的setSkipOutputConversion方法。因此,需要检查functionToInvoke的来源。

进一步排查,发现问题出现在StreamBridge.send方法中,该方法调用了getStreamBridgeFunction,传递了一个FunctionInvocationWrapper。接下来,检查functionCatalog.lookup方法的实现,发现这个方法是BeanFactoryAwareFunctionRegistry的一个实例。在lookup方法中,存在一个条件判断:如果!isFunctionDefinitionEligible(functionDefinition),则返回null。因此,问题可能在于isFunctionDefinitionEligible方法返回false。

检查isFunctionDefinitionEligible方法,发现它接受一个FunctionDefinition作为参数,并返回一个boolean。函数定义中的functionName是空字符串,这可能是一个问题,因为通常函数定义应该有一个有效的名称。

为了进一步排查,检查FunctionProperties类中的setIneligibleDefinitions方法,发现它在项目启动时被设置了一个空字符串。这可能导致后续处理出现问题,因为空字符串通常不适合作为配置的值。

接下来,注意到问题可能与Kafka Streams有关。在KafkaStreamsBinderEnvironmentPostProcessor类中,有一段代码创建了一个空列表,并用String.join拼接,可能引入了一个逗号,导致配置文件中出现空值,进而影响后续的处理。

进一步检查,发现空字符串是从environment.getProperty(ineligibleDefinitionsPropertyKey)中获取的。查看MutablePropertySources类,发现在addLast方法中可能添加了一个空字符串。这意味着在某些环境下,配置文件中没有设置必要的属性,导致property sources中缺少必要的信息。

深入检查,发现问题可能出现在AzurePasswordlessEnvironmentPostProcessor类中。这段代码创建了一个空列表,然后用String.join,可能在处理配置时错误地引入了空值,导致后续的处理出现问题。

最终,发现微软云的解决方案可能在Beta版本,尚未考虑升级,因此决定通过配置文件来解决这个问题。添加如下配置:

spring:  cloud:    function:      ineligible-definitions: xxxxx

这里,xxxxx可以是任意字符串,确保配置文件中有有效的值。这样可以避免空字符串的问题,确保functionToInvoke不再为null。

通过上述步骤,成功找到了问题的根源,并通过配置文件解决了NPE问题。

转载地址:http://ygjfk.baihongyu.com/

你可能感兴趣的文章
npm start运行了什么
查看>>
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
查看>>
npm 下载依赖慢的解决方案(亲测有效)
查看>>
npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
查看>>
npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
查看>>
npm—小记
查看>>
npm介绍以及常用命令
查看>>
NPM使用前设置和升级
查看>>
npm入门,这篇就够了
查看>>
npm切换到淘宝源
查看>>
npm切换源淘宝源的两种方法
查看>>
npm前端包管理工具简介---npm工作笔记001
查看>>
npm包管理深度探索:从基础到进阶全面教程!
查看>>
npm升级以及使用淘宝npm镜像
查看>>
npm发布包--所遇到的问题
查看>>
npm发布自己的组件UI包(详细步骤,图文并茂)
查看>>
npm和yarn清理缓存命令
查看>>
npm和yarn的使用对比
查看>>
npm如何清空缓存并重新打包?
查看>>
npm学习(十一)之package-lock.json
查看>>