博客
关于我
NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
阅读量:793 次
发布时间: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 ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
查看>>
npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
查看>>
npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
查看>>
npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
查看>>
npm install CERT_HAS_EXPIRED解决方法
查看>>
npm install digital envelope routines::unsupported解决方法
查看>>
npm install 卡着不动的解决方法
查看>>
npm install 报错 EEXIST File exists 的解决方法
查看>>
npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
查看>>
npm install 报错 Failed to connect to github.com port 443 的解决方法
查看>>
npm install 报错 fatal: unable to connect to github.com 的解决方法
查看>>
npm install 报错 no such file or directory 的解决方法
查看>>
npm install 权限问题
查看>>
npm install报错,证书验证失败unable to get local issuer certificate
查看>>
npm install无法生成node_modules的解决方法
查看>>
npm install的--save和--save-dev使用说明
查看>>
npm node pm2相关问题
查看>>
npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
查看>>
npm run build报Cannot find module错误的解决方法
查看>>
npm run build部署到云服务器中的Nginx(图文配置)
查看>>