博客
关于我
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/

你可能感兴趣的文章
NodeJs单元测试之 API性能测试
查看>>
nodejs图片转换字节保存
查看>>
nodejs在Liunx上的部署生产方式-PM2
查看>>
nodejs字符与字节之间的转换
查看>>
NodeJs学习笔记001--npm换源
查看>>
NodeJs学习笔记002--npm常用命令详解
查看>>
nodejs学习笔记一——nodejs安装
查看>>
NodeJS实现跨域的方法( 4种 )
查看>>
nodejs封装http请求
查看>>
nodejs常用组件
查看>>
nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
查看>>
Nodejs异步回调的处理方法总结
查看>>
NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
查看>>
Nodejs教程09:实现一个带接口请求的简单服务器
查看>>
nodejs服务端实现post请求
查看>>
nodejs框架,原理,组件,核心,跟npm和vue的关系
查看>>
Nodejs概览: 思维导图、核心技术、应用场景
查看>>
nodejs模块——fs模块
查看>>
Nodejs模块、自定义模块、CommonJs的概念和使用
查看>>
nodejs生成多层目录和生成文件的通用方法
查看>>