自学内容网 自学内容网

@Cacheable 中的SpEL表达式取值为null 原因排查

最近在进行springboot开发时发现 @Cacheable 的 SpEL表达式全为 null了,造成程序异常,缓存都是错误的值,于是进行了排查。
发现SpEL表达式在取参数的时候 getParameterNames 返回了 null。
在这里插入图片描述
到这里就很摸不着头脑了,按理说spring框架这么多年很成熟的了,怎么会有这个问题呢,最大的表现里就是 spring web mvc 中的参数绑定,和这里的情况差不多。如果@Cacheable失效了,那么mvc的功能岂不也有很大问题。
于是 Debug 跟踪代码到 ParameterNameDiscoverer。
在这里插入图片描述
DefaultParameterNameDiscoverer继承自PrioritizedParameterNameDiscoverer(一个ParameterNameDiscoverer代理,里面维护了带优先级的参数名解析器集合,先添加的优先解析,如果某个解析器解析后返回null,则会使用下一个解析器进行解析,默认情况下使用Java 8的反射机制进行解析,解析失败就fall back到使用基于ASM的参数解析器去获取class文件里的debug信息),在构造DefaultParameterNameDiscoverer时就维护了解析器集合,如果类路径下存在java.lang.reflect.Executable,就添加一个StandardReflectionParameterNameDiscoverer(使用Java 8的反射机制),再添加基于ASM的参数解析器LocalVariableTableParameterNameDiscoverer,用于fall back时的解析
(https://blog.csdn.net/qq271859852/article/details/84963672)

看这个解释很有可能是和字节码相关了,于是查了一下class的反编译信息:
在这里插入图片描述
参数名称给混淆了,而功能正常的程序里是带参数名了。
在这里插入图片描述
操作class文件的也就是编译器了,IDE或者maven的配置相关。于是查看了一下idea的配置,果然,module 的配置里 -parameters 不知为啥给去掉了,添加上就好了。
在这里插入图片描述

参考:
https://cloud.tencent.com/developer/article/1497597
https://blog.csdn.net/qq271859852/article/details/84963672


原文地址:https://blog.csdn.net/u013257767/article/details/142522727

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!