修复Spring Cache中SpelEvaluationException: EL1007E异常
异常原因分析与排查方向
这个EL1007E异常的核心是:SPEL表达式尝试访问一个null对象的universalId属性,而该属性属于CreateAccountRequest类。结合你提到的同版本项目可正常运行的情况,排查方向如下:
1. 方法参数名未被正确保留,导致SPEL无法定位参数对象
Spring SPEL解析方法参数时,依赖编译时保留的参数名。如果项目编译时未开启-parameters参数,或使用了混淆工具,参数名会被替换成arg0、arg1这类默认名称,导致SPEL找不到你指定的参数变量。
- 排查:检查
pom.xml中maven-compiler-plugin的配置,确认是否添加了<parameters>true</parameters>:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <!-- 对应你的JDK版本 --> <target>17</target> <parameters>true</parameters> <!-- 开启后保留参数名 --> </configuration> </plugin> - 对比:确认正常运行的项目是否开启了该配置。如果你的
@CachePut用了#request.universalId,但编译后参数名变成arg0,SPEL会找不到request变量,解析结果为null。
2. 调用方法时传入的CreateAccountRequest参数为null
如果调用带@CachePut注解的方法时,传入的CreateAccountRequest对象本身是null,访问它的universalId属性必然抛出该异常。
- 排查:在方法入口加日志或断点,检查传入的请求对象是否为null;同时检查调用方代码,确认是否正确构造并传入了
CreateAccountRequest实例。
3. SPEL表达式的变量指向错误
检查@CachePut注解中的key表达式,是否错误引用了非参数对象:
- 比如误写为
#result.universalId(#result代表方法返回值),但返回值不是CreateAccountRequest类型或返回值为null; - 或表达式中使用了未定义的变量名,导致SPEL解析为null。
- 对比:和正常项目的
@CachePut表达式逐字符对比,确认变量名是否一致。
4. CreateAccountRequest类缺少universalId的getter方法
SPEL默认通过getter方法访问对象属性,而非直接访问字段。如果universalId是private字段且没有对应的getUniversalId()方法,SPEL可能无法解析该属性。
- 排查:检查
CreateAccountRequest类代码,确认是否存在对应类型的getUniversalId()方法; - 对比:正常项目中的
CreateAccountRequest类是否有该getter方法。
5. Spring Cache配置存在差异
虽然同是Spring Boot 3.3.4,但两个项目的Cache配置可能不同:
- 比如某个项目自定义了
KeyGenerator,改变了SPEL的解析上下文; - 或缓存管理器(如RedisCacheManager)开启了特殊选项,影响参数解析。
- 排查:对比两个项目的
@Configuration类中Cache相关配置,以及application.yml/application.properties里的缓存配置项。
内容的提问来源于stack exchange,提问作者jianmin tu
相关产品推荐
相关产品推荐

